此部落格介紹了簡單但有用的提示和優化,以提高儲存過程的效能。
exec uspgetsalesinfofordaterange 『1/1/2009』, 31/12/2009 with recompile
sql server在執行select或dml操作時返回資訊性訊息。
如果乙個過程有許多這樣的語句,游標或while迴圈sql server將顯示許多此類訊息,增加網路流量。
可以使用set nocount on來抑制這些訊息,並可以通過減少網路流量來提高效能。
完全限定的物件名稱是database.schema.objectname。
當儲存過程作為schemaname.procedurename呼叫時,sql server可以快速查詢已編譯的計畫,而不是在未指定schemaname時查詢其他模式中的過程。
這可能不會對效能產生很大的推動作用,但應該遵循最佳實踐。
過程中的所有物件也應該稱為schemaname.objectname。
sp_executesql允許重用快取計畫並防止sql注入。
我們來看乙個計畫重用的例子。
dbcc上面的查詢使用execute命令為salesorderid 43660和43661的兩個值執行動態查詢。讓我們分析快取的計畫。freeproccache
godeclare
@dynamic_sql
varchar(max
),@salesorderid
intset
@salesorderid
=43660
set@dynamic_sql='
select * from sales.salesorderdetail where salesorderid='+
cast(@salesorderid
asvarchar(100
))execute(@dynamic_sql)
如上面的快照所示,兩個salesorderids有兩個單獨的計畫。
現在讓我們使用sp_execute sql執行相同的查詢並分析快取的計畫。
declare上面的查詢使用sp_executesql為2個不同的salesorderid值執行動態查詢。@dynamic_sql
nvarchar(100
)set
@dynamic_sql
= n'
select * from sales.salesorderdetail where salesorderid=@salesorderid
'execute sp_executesql @dynamic_sql, n'
@salesorderid int
', @salesorderid
=43661
我們來分析一下快取的計畫。
如上面的快照所示,只快取了乙個計畫,並用於salesorderid的不同值。
if exists用於檢查記錄,物件等的存在。並且是乙個方便的語句,用於提高查詢的效能,其中乙個只想檢查表中記錄的存在而不是在查詢中使用該記錄/行。
這樣做的時候使用if exists(來自mytable的select 1)而不是if exists(從mytable中選擇*),因為我們感興趣的只是檢查記錄/ s的存在。
因此,如果查詢返回1,則記錄存在,否則不存在。
無需返回所有列值。
如果儲存過程以sp_開頭,則sql server首先在master資料庫中搜尋它,然後在當前使用者資料庫中搜尋它。
這可能會導致輕微的效能問題,而且如果master資料庫中存在具有相同名稱的儲存過程,則可能導致錯誤的結果。
t-sql是一種基於集合的語言,因此迴圈在這裡不能很好地工作。
僅當基於集合的查詢要麼昂貴或無法制定時,才使用游標和while迴圈。
事務越長,根據隔離級別保持鎖定的時間越長。
這可能會導致死鎖和阻塞。
開啟乙個新的查詢視窗並執行以下查詢
use請注意查詢的會話id。adventureworks2014
gobegin
transaction
settransaction
isolation
level
serializable
select
*from sales.salesorderdetail
開啟乙個新的查詢視窗並執行以下查詢。
記下查詢的會話id。
begin以上更新查詢將等待共享鎖上的選擇查詢。tran
update
sales.salesorderdetail
set orderqty=
50where salesorderdetailid=
1
讓我們分析這兩個會話的鎖。
如上面的快照所示,會話58更新查詢正在等待會話57採取的共享鎖。
請遵循這些提示,讓我知道它如何提高程式效能。
將返回一些更多提示和最佳實踐。
SQL SERVER 匯入EXCEL的儲存過程
1.先在查詢分析器裡執行 exec sp configure show advanced options 1 reconfigure exec sp configure ad hoc distributed queries 1 reconfigure 2.儲存過程 alter procedure d...
SQL SERVER 匯入EXCEL的儲存過程
1.先在查詢分析器裡執行 exec sp configure show advanced options 1 reconfigure exec sp configure ad hoc distributed queries 1 reconfigure 2.儲存過程 alter procedure d...
SQL SERVER 匯入EXCEL的儲存過程
1.先在查詢分析器裡執行 exec sp configure show advanced options 1 reconfigure exec sp configure ad hoc distributed queries 1 reconfigure 2.儲存過程 alter procedure d...