重溫sqlserver 常用的七種優化存儲過程的方法

在寫了近一年的文檔加php之後,原先對於sql server 的一點知識確實都忘光了,這裏轉載一篇他人的文章,很實用的一些技巧。


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 
end try 
begin catch 
    --if error 
    rollback 
end catch


文章出處 

SQL Server 優化存儲過程的七種方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章