當前位置:首頁 » 存儲配置 » sql存儲過程try

sql存儲過程try

發布時間: 2025-01-02 05:14:32

1. sql Server 優化存儲過程的方法有哪些

優化存儲過程有很多種方法,下面介紹最常用的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
end try
begin catch
--if error
rollback
end catch
====================== 分割線 =======================

『自己的一些調優經驗』
1. 少使用游標是個很好的建議,為此,我自己也遇到過一些事故,是游標所造成的,由於,游標是逐行逐行操作的,當記錄較多時,經常會遇到超時的情況。
2. 多表join做查詢時,查詢的欄位盡量不要使用case when then else end的語法,或者使用用戶函數,例如:
select (case when fType=1 then '是' else '否' end) as fTypeName, dbo.F_GetFullName(fID) as fFullName from Table1 inner join Table2……
當兩個表的數據量非常大時,你可以在查詢分析器中明顯感覺到:直接查詢fType和fID與查詢上面兩個欄位的速度,很可能使用了一個case when then就導致超時。
針對這種情況,可以分兩種做法:
第一,把一些簡單的轉換可以放在程序中完成。
第二,如果需要通過ID查詢全名或者全稱,類似的,可以創建好視圖,直接查視圖,或者,先把所有的fFullName查出來放到臨時表中,直接join臨時表(如果這個數據不是很多的話),獲得fFullName。
3. 少使用一些嵌套的查詢,用臨時表緩存中間數據,例如:
select * from Table1
inner join (
select count(1) as count, Table2.ID2 from Table2 inner join Table3 on ID2=ID3 group by Table2.ID2

) as t1 on t1.ID1 = Table1.ID1

我曾經遇到這樣情況,上面的語句是那種情況的簡化版本,把其他不影響結果的表格都去掉了,發現一個奇怪的現象:嵌套查詢的結果集並不大,大約就200多行,Table1有6w條記錄,結果,這個查詢語句超時,查詢分析器中執行2分鍾也得不到結果。
後來,這樣一改,就Ok了,3秒出結果:
select count(1) as count, Table2.ID2 into #temp from Table2 inner join Table3 on ID2=ID3 group by Table2.ID2
select * from Table1
inner join #temp as t1 on t1.ID1 = Table1.ID1
這樣一改,效率提升了幾十倍,猜想:可能是嵌套的查詢是動態的,每一行的join可能都需要先執行嵌套的查詢,從而導致效率極差。
所以,如果查詢足夠復雜,join多個表,需要連接多個通過group by求和、求平均數等運算計算出來的中間數據,那麼,不妨多使用臨時表緩存中間數據。
4. 還有一些是必須遵守的一些默認規則,比如:

先過濾後連接。
查詢的欄位最要不要用「*」,指定需要用的欄位,減少網路流量。

『總結』
對於性能的追求是沒有極限的,做到你所能做到的,這是一個很好的習慣。
有些業務邏輯放在存儲過程中處理比較方便,而有些業務邏輯交給程序來處理,同樣會提升系統整體的效率,看實際情況而定。
總之,盡可能減少這些容易引發性能問題的隱患,系統就會跑得更穩定更有效率,一切從小細節做起。

2. Sqlserver 8.0.2039 存儲過程怎樣寫try catch

sql2005 以下版本沒有 try catch語句塊;
通常採用 @@error 來判斷;
code:
declare @error int
set @error = 0
begin tran
--your sql here and exceut
set @error = @@error + @error
if(@error <> 0 ) --has error
begin
rollback ;

return;

end

--another sql code and excut it ..
set @error = @@error + @error
if(@error <> 0 ) --has error
begin
rollback ;

return;

end

commit

熱點內容
免費flash上傳網 發布:2025-01-06 23:15:40 瀏覽:257
python製表 發布:2025-01-06 23:15:37 瀏覽:450
python數據排序 發布:2025-01-06 23:14:23 瀏覽:33
同配置的朗逸和寶來怎麼選 發布:2025-01-06 23:14:06 瀏覽:543
c語言分離數位 發布:2025-01-06 23:10:44 瀏覽:915
率土之濱如何刪掉伺服器 發布:2025-01-06 23:10:43 瀏覽:10
用手機改wifi密碼軟體是什麼 發布:2025-01-06 23:03:34 瀏覽:816
連雲港dns的伺服器地址是多少 發布:2025-01-06 23:01:02 瀏覽:393
python書好 發布:2025-01-06 23:00:26 瀏覽:166
我的世界伺服器必備指令低配版 發布:2025-01-06 23:00:24 瀏覽:703