本人才疏學淺,大牛請繞道!有不足的地方望糾正,望填補,大家互相進步!
言歸正傳,優化儲存過程有很多種方法,大家一起看看和討論下
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,要注意索引的維護,週期性重建索引,重新編譯儲存過程。
儲存過程優化
im cons integral表為分割槽表按照org no 單位編碼 分割槽 有效期歷史資料處理 begin for cur in select from sgpm.o org where org type in 04 05 06 loop insert into a temp ly log se...
優化儲存過程的7中方法
優化儲存過程有很多種方法,下面介紹最常用的7種。1.使用set nocount on選項 我們使用select語句時,除了返回對應的結果集外,還會返回相應的影響行數。使用set nocount on後,除了資料集就不會返回額外的資訊了,減小網路流量。2.使用確定的schema 在使用表,儲存過程,函...
優化儲存過程7種方法
優化儲存過程有很多種方法,下面介紹最常用的7種。1.使用set nocount on選項 我們使用select語句時,除了返回對應的結果集外,還會返回相應的影響行數。使用set nocount on後,除了資料集就不會返回額外的資訊了,減小網路流量。2.使用確定的schema 在使用表,儲存過程,函...