(4 26)sql server儲存過程優化

2022-02-15 03:03:45 字數 2510 閱讀 9374

此部落格介紹了簡單但有用的提示和優化,以提高儲存過程的效能。

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

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)

上面的查詢使用execute命令為salesorderid 43660和43661的兩個值執行動態查詢。讓我們分析快取的計畫。

如上面的快照所示,兩個salesorderids有兩個單獨的計畫。

現在讓我們使用sp_execute sql執行相同的查詢並分析快取的計畫。

declare

@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

上面的查詢使用sp_executesql為2個不同的salesorderid值執行動態查詢。

我們來分析一下快取的計畫。

如上面的快照所示,只快取了乙個計畫,並用於salesorderid的不同值。

if exists用於檢查記錄,物件等的存在。並且是乙個方便的語句,用於提高查詢的效能,其中乙個只想檢查表中記錄的存在而不是在查詢中使用該記錄/行。

這樣做的時候使用if exists(來自mytable的select 1)而不是if exists(從mytable中選擇*),因為我們感興趣的只是檢查記錄/ s的存在。

因此,如果查詢返回1,則記錄存在,否則不存在。

無需返回所有列值。

如果儲存過程以sp_開頭,則sql server首先在master資料庫中搜尋它,然後在當前使用者資料庫中搜尋它。

這可能會導致輕微的效能問題,而且如果master資料庫中存在具有相同名稱的儲存過程,則可能導致錯誤的結果。

t-sql是一種基於集合的語言,因此迴圈在這裡不能很好地工作。

僅當基於集合的查詢要麼昂貴或無法制定時,才使用游標和while迴圈。

事務越長,根據隔離級別保持鎖定的時間越長。

這可能會導致死鎖和阻塞。

開啟乙個新的查詢視窗並執行以下查詢

use

adventureworks2014

gobegin

transaction

settransaction

isolation

level

serializable

select

*from sales.salesorderdetail

請注意查詢的會話id。

開啟乙個新的查詢視窗並執行以下查詢。

記下查詢的會話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...