優化存儲過程有很多種方法,下面介紹最常用的7種。
1.使用SET NOCOUNT ON選項
我們使用SELECT語句時,除了傳回對應的結果集外,還會傳回相應的影響行數。使用SET NOCOUNT ON後,除了資料集就不會傳回額外的資訊了,減小網絡流量。
2.使用确定的Schema
在使用表,存儲過程,函數等等時,最好加上确定的Schema。這樣可以使SQL Server直接找到對應目标,避免去計劃緩存中搜尋。而且搜尋會導緻編譯鎖定,最終影響性能。比如select * from dbo.TestTable比select * from TestTable要好。from TestTable會在目前Schema下搜尋,如果沒有,再去dbo下面搜尋,影響性能。而且如果你的表是csdn.TestTable的話,那麼select * from TestTable會直接報找不到表的錯誤。是以寫上具體的Schema也是一個好習慣。
3.自定義存儲過程不要以sp_開頭
因為以sp_開頭的存儲過程預設為系統存儲過程,是以首先會去master庫中找,然後在目前資料庫找。建議使用USP_或者其他辨別開頭。
4.使用sp_executesql替代exec
原因在Inside Microsoft SQL Server 2005 T-SQL Programming書中的第四章Dynamic SQL裡面有具體描述。這裡隻是簡單說明一下:sp_executesql可以使用參數化,進而可以重用執行計劃。exec就是純拼SQL語句。
5.少使用遊标
可以參考Inside Microsoft SQL Server 2005 T-SQL Programming書中的第三章Cursors裡面有具體描述。總體來說,SQL是個集合語言,對于集合運算具有較高的性能,而Cursors是過程運算。比如對一個100萬行的資料進行查詢,遊标需要讀表100萬次,而不使用遊标隻需要少量幾次讀取。
6.事務越短越好
SQL Server支援并發操作。如果事務過多過長,或是隔離級别過高,都會造成并發操作的阻塞,死鎖。此時現象是查詢極慢,同時cup占用率極低。
7.使用try-catch來處理錯誤異常
SQL Server 2005及以上版本提供對try-catch的支援,文法為:
begin try
----your code
end try
begin catch
--error dispose
end catch
一般情況可以将try-catch同僚務結合在一起使用。
begin try
begin tran
--select
--update
--delete
--…………
commit
--if error
rollback