儲存過程編寫經驗和優化措施
一、適合讀者物件:資料庫開發程式設計師,資料庫的資料量很多,涉及到對SP(儲存過程)的優化的專案開發人員,對資料庫有濃厚興趣的人。
二、介紹:在資料庫的開發過程中,經常會遇到複雜的業務邏輯和對資料庫的操作,這個時候就會用SP來封裝資料庫操作。如果專案的SP較多,書寫又沒有一定的規範,將會影響以後的系統維護困難和大SP邏輯的難以理解,另外如果資料庫的資料量大或者專案對SP的效能要求很,就會遇到優化的問題,否則速度有可能很慢,經過親身經驗,一個經過優化過的SP要比一個效能差的SP的效率甚至高几百倍。
三、內容:
1、開發人員如果用到其他庫的Table或View,務必在當前庫中建立View來實現跨庫操作,最好不要直接使用“databse.dbo.table_name”,因為sp_depends不能顯示出該SP所使用的跨庫table或view,不方便校驗。
2、開發人員在提交SP前,必須已經使用set showplan on分析過查詢計劃,做過自身的查詢優化檢查。
3、高程式執行效率,優化應用程式,在SP編寫過程中應該注意以下幾點:
a)SQL的使用規範:
i. 儘量避免大事務操作,慎用holdlock子句,提高系統併發能力。
ii. 儘量避免反覆訪問同一張或幾張表,尤其是資料量較大的表,可以考慮先根據條件提取資料到臨時表中,然後再做連線。
iii. 儘量避免使用遊標,因為遊標的效率較差,如果遊標操作的資料超過萬行,那麼就應該改寫;如果使用了遊標,就要儘量避免在遊標迴圈中再進行表連線的操作。
iv. 注意where字句寫法,必須考慮語句順序,應該根據索引順序、範圍大小來確定條件子句的前後順序,儘可能的讓欄位順序與索引順序相一致,範圍從大到小。
v. 不要在where子句中的“=”左邊進行函式、算術運算或其他表示式運算,否則系統將可能無法正確使用索引。
vi. 儘量使用exists代替select count(1)來判斷是否存在記錄,count函式只有在統計表中所有行數時使用,而且count(1)比count(*)更有效率。
vii. 儘量使用“>=”,不要使用“>”。
viii. 注意一些or子句和union子句之間的替換
ix. 注意表之間連線的資料型別,避免不同型別資料之間的連線。
x. 注意儲存過程中引數和資料型別的關係。
xi. 注意insert、update操作的資料量,防止與其他應用衝突。如果資料量超過個資料頁面(k),那麼系統將會進行鎖升級,頁級鎖會升級成表級鎖。
b)索引的使用規範:
i. 索引的建立要與應用結合考慮,建議大的OLTP表不要超過個索引。
ii. 儘可能的使用索引欄位作為查詢條件,尤其是聚簇索引,必要時可以通過index index_name來強制指定索引
iii. 避免對大表查詢時進行table scan,必要時考慮新建索引。
iv. 在使用索引欄位作為條件時,如果該索引是聯合索引,那麼必須使用到該索引中的第一個欄位作為條件時才能保證系統使用該索引,否則該索引將不會被使用。
v. 要注意索引的維護,週期性重建索引,重新編譯儲存過程。
c)tempdb的使用規範:
i. 儘量避免使用distinct、order by、group by、having、join、cumpute,因為這些語句會加重tempdb的負擔。
ii. 避免頻繁建立和刪除臨時表,減少系統表資源的消耗。
iii. 在新建臨時表時,如果一次性插入資料量很大,那麼可以使用select into代替create table,避免log,提高速度;如果資料量不大,為了緩和系統表的資源,建議先create table,然後insert。
iv. 如果臨時表的資料量較大,需要建立索引,那麼應該將建立臨時表和建立索引的過程放在單獨一個子儲存過程中,這樣才能保證系統能夠很好的使用到該臨時表的索引。
v. 如果使用到了臨時表,在儲存過程的最後務必將所有的臨時表顯式刪除,先truncate table,然後drop table,這樣可以避免系統表的較長時間鎖定。
vi. 慎用大的臨時表與其他大表的連線查詢和修改,減低系統表負擔,因為這種操作會在一條語句中多次使用tempdb的系統表。
d)合理的演算法使用:
根據上面已提到的SQL優化技術和ASE Tuning手冊中的SQL優化內容,結合實際應用,採用多種演算法進行比較,以獲得消耗資源最少、效率最高的方法。具體可用ASE調優命令:set statistics io on, set statistics time on , set showplan on 等。
原文地址:http://www.cnblogs.com/zhangtao/archive/2009/11/05/1597000.html
二、介紹:在資料庫的開發過程中,經常會遇到複雜的業務邏輯和對資料庫的操作,這個時候就會用SP來封裝資料庫操作。如果專案的SP較多,書寫又沒有一定的規範,將會影響以後的系統維護困難和大SP邏輯的難以理解,另外如果資料庫的資料量大或者專案對SP的效能要求很,就會遇到優化的問題,否則速度有可能很慢,經過親身經驗,一個經過優化過的SP要比一個效能差的SP的效率甚至高几百倍。
三、內容:
1、開發人員如果用到其他庫的Table或View,務必在當前庫中建立View來實現跨庫操作,最好不要直接使用“databse.dbo.table_name”,因為sp_depends不能顯示出該SP所使用的跨庫table或view,不方便校驗。
2、開發人員在提交SP前,必須已經使用set showplan on分析過查詢計劃,做過自身的查詢優化檢查。
3、高程式執行效率,優化應用程式,在SP編寫過程中應該注意以下幾點:
a)SQL的使用規範:
i. 儘量避免大事務操作,慎用holdlock子句,提高系統併發能力。
ii. 儘量避免反覆訪問同一張或幾張表,尤其是資料量較大的表,可以考慮先根據條件提取資料到臨時表中,然後再做連線。
iii. 儘量避免使用遊標,因為遊標的效率較差,如果遊標操作的資料超過萬行,那麼就應該改寫;如果使用了遊標,就要儘量避免在遊標迴圈中再進行表連線的操作。
iv. 注意where字句寫法,必須考慮語句順序,應該根據索引順序、範圍大小來確定條件子句的前後順序,儘可能的讓欄位順序與索引順序相一致,範圍從大到小。
v. 不要在where子句中的“=”左邊進行函式、算術運算或其他表示式運算,否則系統將可能無法正確使用索引。
vi. 儘量使用exists代替select count(1)來判斷是否存在記錄,count函式只有在統計表中所有行數時使用,而且count(1)比count(*)更有效率。
vii. 儘量使用“>=”,不要使用“>”。
viii. 注意一些or子句和union子句之間的替換
ix. 注意表之間連線的資料型別,避免不同型別資料之間的連線。
x. 注意儲存過程中引數和資料型別的關係。
xi. 注意insert、update操作的資料量,防止與其他應用衝突。如果資料量超過個資料頁面(k),那麼系統將會進行鎖升級,頁級鎖會升級成表級鎖。
b)索引的使用規範:
i. 索引的建立要與應用結合考慮,建議大的OLTP表不要超過個索引。
ii. 儘可能的使用索引欄位作為查詢條件,尤其是聚簇索引,必要時可以通過index index_name來強制指定索引
iii. 避免對大表查詢時進行table scan,必要時考慮新建索引。
iv. 在使用索引欄位作為條件時,如果該索引是聯合索引,那麼必須使用到該索引中的第一個欄位作為條件時才能保證系統使用該索引,否則該索引將不會被使用。
v. 要注意索引的維護,週期性重建索引,重新編譯儲存過程。
c)tempdb的使用規範:
i. 儘量避免使用distinct、order by、group by、having、join、cumpute,因為這些語句會加重tempdb的負擔。
ii. 避免頻繁建立和刪除臨時表,減少系統表資源的消耗。
iii. 在新建臨時表時,如果一次性插入資料量很大,那麼可以使用select into代替create table,避免log,提高速度;如果資料量不大,為了緩和系統表的資源,建議先create table,然後insert。
iv. 如果臨時表的資料量較大,需要建立索引,那麼應該將建立臨時表和建立索引的過程放在單獨一個子儲存過程中,這樣才能保證系統能夠很好的使用到該臨時表的索引。
v. 如果使用到了臨時表,在儲存過程的最後務必將所有的臨時表顯式刪除,先truncate table,然後drop table,這樣可以避免系統表的較長時間鎖定。
vi. 慎用大的臨時表與其他大表的連線查詢和修改,減低系統表負擔,因為這種操作會在一條語句中多次使用tempdb的系統表。
d)合理的演算法使用:
根據上面已提到的SQL優化技術和ASE Tuning手冊中的SQL優化內容,結合實際應用,採用多種演算法進行比較,以獲得消耗資源最少、效率最高的方法。具體可用ASE調優命令:set statistics io on, set statistics time on , set showplan on 等。
原文地址:http://www.cnblogs.com/zhangtao/archive/2009/11/05/1597000.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-618256/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL優化---儲存過程和儲存函式-1-轉自部落格園MySql優化儲存過程儲存函式
- Oracle優化案例-儲存過程的優化思路(二十三)Oracle優化儲存過程
- oracle儲存過程書寫格式Oracle儲存過程
- 儲存程式和程式控制:開發經驗分享及操作過程詳解
- Q&A:在SQL Server 2005中編寫儲存過程RVSQLServer儲存過程
- mysql和orcale的儲存過程和儲存函式MySql儲存過程儲存函式
- MySQL 儲存過程和函式MySql儲存過程函式
- MySQL儲存過程和函式MySql儲存過程函式
- MySQL的寫入資料儲存過程MySql儲存過程
- SQL Server儲存過程的優缺點SQLServer儲存過程
- Oracle儲存過程乾貨(一):儲存過程基礎Oracle儲存過程
- SQL 儲存過程裡呼叫另一個儲存過程SQL儲存過程
- 儲存過程與儲存函式儲存過程儲存函式
- SQLSERVER儲存過程SQLServer儲存過程
- 呼叫儲存過程儲存過程
- mysql 儲存過程MySql儲存過程
- unidac儲存過程儲存過程
- firedac儲存過程儲存過程
- Oracle儲存過程Oracle儲存過程
- Oracle 編譯儲存過程卡死解決方法Oracle編譯儲存過程
- MySQL入門--儲存過程(PROCEDURE)和儲存函式(FUNCTION)MySql儲存過程儲存函式Function
- oracle儲存過程和觸發器Oracle儲存過程觸發器
- MySQL儲存過程的建立和使用MySql儲存過程
- MYSQL學習與實驗(八)——儲存過程實驗MySql儲存過程
- Oracle儲存過程編譯卡死的解決方法Oracle儲存過程編譯
- Oracle儲存過程中跳出迴圈的寫法Oracle儲存過程
- JdbcTemplate調儲存過程JDBC儲存過程
- 造數儲存過程儲存過程
- 儲存過程——遊標儲存過程
- 儲存過程 傳 datatable儲存過程
- JAVA儲存過程(轉)Java儲存過程
- MySQL之儲存過程MySql儲存過程
- oracle的儲存過程Oracle儲存過程
- MySQL---------儲存過程MySql儲存過程
- linux呼叫儲存過程Linux儲存過程
- Winform呼叫儲存過程ORM儲存過程
- mysql儲存過程整理MySql儲存過程
- Oracle儲存過程-1Oracle儲存過程
- 頭歌資料庫實驗六:儲存過程資料庫儲存過程