本人才疏學淺,大牛請繞道!有不足的地方望糾正,望填補,大家互相進步!
言歸正傳,優化存儲過程有很多種方法,大家一起看看和討論下
1,盡量利用一些sql語句來替代一些小循環,例如聚合函數,求平均函數等。
2,不再按照算法描述,以致將一條長達100多個字段的紀錄分90次來更新,而是采用拼湊語句,將更新語句在循環中拼湊后,再統一更新。
3,使用確定的schema, 在使用表,函數,存儲過程等等時,最好加上確定的schema,這樣可以使sqlserver直接找到對應目標,避免去計划緩存中搜索,而且搜
索會導致編譯鎖定,最終影響性能。如select * from dbo.a比select * from a要好。
4,自定義存儲過程不要以_sp開頭。因為以_sp開頭的存儲過程默認為系統存儲過程,所以首先會去master庫中去找,然后再在當前數據庫中找。
5,使用sp_executesql替代exec. sp_executesql可以使用參數化,從而可以重用執行計划。而exec就是純拼sql語句。
6,中間結果存放於臨時表,加索引。
7,少使用游標。sql是個集合語言,對於集合運算具有較高性能。而cursors是過程運算。比如對一個100萬行的數據進行查詢。游標需要讀表100萬次,而不使用
游標則只需要少量幾次讀取。
8,事務越短越好。sqlserver支持並發操作。如果事務過多過長,或者隔離級別過高,都會造成並發操作的阻塞,死鎖。導致查詢極慢,cpu占用率極地。
9,使用try-catch處理錯誤異常。
10,查找語句盡量不要放在循環內。
----------------------------------------------------------------------
sql的使用規范:
1,盡量避免大事務操作,慎用holdlock字句,提高系統並發能力。
2,盡量避免反復訪問同一張或幾張表,尤其事數據量較大的表,可以考慮先根據條件提取數據到臨時表中,然后再做連接。
3,盡量避免使用游標,因為游標的效率較差,如果游標操作的數據超過1萬行,那么就應該改寫;如果使用了游標,就要盡量避免在游標循環中再進行表連接的
操作。
4,注意where字句寫法,必須考慮語句順序。應該根據索引順序,范圍大小來確定條件字句的先后順序,盡可能的讓字段順序與索引順序相一致,范圍從大到
小。
5,不要在where子句中的“=”左邊進行函數、算術運算或其他表達式運算,否則系統可能無法正確使用索引。
6,盡量使用exists代替select count(1)來判斷是否存在紀錄。count函數只有在統計表中所有行數時使用,而且count(1)比count(*)更有效率。
7,盡量使用“>=”,不要使用“>”。
8,注意一些or子句和union子句之間的替換。
9,注意表之間連接的數據類型,避免不同類型數據之間的連接。
10,注意存儲過程中參數和數據類型的關系。
11,注意insert、update操作的數據量,防止與其它應用沖突,如果數據量超過200個數據頁面(400k),那么系統將會進行鎖升級,頁級鎖會升級為表級
鎖。
----------------------------------------------------------------------
索引的使用規范:
1,索引的創建要與應用結合考慮,建議大的oltp表不要超過6個索引。
2,盡可能的使用索引字段作為查詢條件,尤其是聚簇索引,必要時可以通過index index_name來強制指定索引。
3,避免對大表查詢時進行table scan,必要時考慮新建索引。
4,在使用索引字段作為條件時,如果該索引是聯合索引,那么必須使用到該索引中的第一個字段作為條件時才能保證系統使用該索引,否則該索引將不會被
使用。
5,要注意索引的維護,周期性重建索引,重新編譯存儲過程。
----------------------------------------------------------------------