SQL Server Parameter Sniffing及其改進(jìn)方法
SQL Server 在處理存儲(chǔ)過程的時(shí)候,為了節(jié)省編譯時(shí)間,是一次編譯,多次重用。當(dāng)?shù)谝淮芜\(yùn)行時(shí)代入值產(chǎn)生的執(zhí)行計(jì)劃,不適用后續(xù)代入的參數(shù)時(shí),就產(chǎn)生了parameter sniffing問題。 create procedure Sniff1(@i int) as SELECT count(b.SalesOrderID),sum(p.weight) from [Sale
SQL Server 在處理存儲(chǔ)過程的時(shí)候,為了節(jié)省編譯時(shí)間,是一次編譯,多次重用。當(dāng)?shù)谝淮芜\(yùn)行時(shí)代入值產(chǎn)生的執(zhí)行計(jì)劃,不適用后續(xù)代入的參數(shù)時(shí),就產(chǎn)生了parameter sniffing問題。
create procedure Sniff1(@i int) as SELECT count(b.SalesOrderID),sum(p.weight) from [Sales].[SalesOrderHeader] a inner join [Sales].[SalesOrderDetail] b on a.SalesOrderID = b.SalesOrderID inner join Production.Product p on b.ProductID = p.ProductID where a.SalesOrderID =@i; go DBCC FREEPROCCACHE exec Sniff1 50000; exec Sniff1 75124; go
Parameter Sniffing問題發(fā)生不頻繁,只會(huì)發(fā)生在數(shù)據(jù)分布不均勻或者代入?yún)?shù)值不均勻的情況下。現(xiàn)在,我們就來探討下如何解決這類問題。
1. 使用Exec() 方式運(yùn)行動(dòng)態(tài)SQL
create procedure Nosniff1(@i int) as declare @cmd varchar(1000); set @cmd = 'SELECT count(b.SalesOrderID),sum(p.weight) from [Sales].[SalesOrderHeader] a inner join [Sales].[SalesOrderDetail] b on a.SalesOrderID = b.SalesOrderID inner join Production.Product p on b.ProductID = p.ProductID where a.SalesOrderID ='; exec(@cmd+@i); go
exec Nosniff1 50000;
exec Nosniff1 75124;
從上述trace中可以看到,在執(zhí)行查詢語(yǔ)句之前,都有SP: CacheInsert事件,SQL Server做了動(dòng)態(tài)編譯,根據(jù)變量的值,都正確的預(yù)估了結(jié)果集,給出了不同的執(zhí)行計(jì)劃。
2. 使用本地變量
create procedure Nosniff2(@i int) as declare @iin int; set @iin=@i SELECT count(b.SalesOrderID),sum(p.weight) from [Sales].[SalesOrderHeader] a inner join [Sales].[SalesOrderDetail] b on a.SalesOrderID = b.SalesOrderID inner join Production.Product p on b.ProductID = p.ProductID where a.SalesOrderID =@iin; go
exec Nosniff2 50000;
exec Nosniff2 75124;
如上一篇文章所述,使用本地變量,參數(shù)值在存儲(chǔ)過程語(yǔ)句執(zhí)行過程中得到,SQL Server在運(yùn)行時(shí)不知道變量的值,會(huì)根據(jù)一個(gè)預(yù)估值進(jìn)行編譯,給出一個(gè)折中的執(zhí)行計(jì)劃。
3. 使用Query Hint,指定執(zhí)行計(jì)劃
在 SELECT、DELETE、UPDATE 和 MERGE 語(yǔ)句最后加上OPTION ( [ ,...n ] ),對(duì)執(zhí)行計(jì)劃進(jìn)行指導(dǎo)。當(dāng)數(shù)據(jù)庫(kù)管理員知道問題所在時(shí),可以通過hint引導(dǎo)SQL Server生成一個(gè)對(duì)所有變量都不太差的執(zhí)行計(jì)劃。
以上所述是小編給大家介紹的SQL Server Parameter Sniffing及其改進(jìn)方法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)我們網(wǎng)站的支持!
上一篇:SQL Server學(xué)習(xí)筆記之事務(wù)、鎖定、阻塞、死鎖用法詳解
欄 目:MsSql
下一篇:SQL Server ltrim(rtrim()) 去不掉空格的原因分析
本文標(biāo)題:SQL Server Parameter Sniffing及其改進(jìn)方法
本文地址:http://mengdiqiu.com.cn/a1/MsSql/10450.html
您可能感興趣的文章
- 01-10SQLServer存儲(chǔ)過程實(shí)現(xiàn)單條件分頁(yè)
- 01-10SQL Server 2012降級(jí)至2008R2的方法
- 01-10SQLServer中防止并發(fā)插入重復(fù)數(shù)據(jù)的方法詳解
- 01-10SQL Server數(shù)據(jù)庫(kù)定時(shí)自動(dòng)備份
- 01-10SQL Server性能調(diào)優(yōu)之緩存
- 01-10實(shí)現(xiàn)SQL Server 原生數(shù)據(jù)從XML生成JSON數(shù)據(jù)的實(shí)例代碼
- 01-10Sql Server 死鎖的監(jiān)控分析解決思路
- 01-10SqlServer 在事務(wù)中獲得自增ID的實(shí)例代碼
- 01-10SqlServer快速檢索某個(gè)字段在哪些存儲(chǔ)過程中(sql 語(yǔ)句)
- 01-10SQLServer性能優(yōu)化--間接實(shí)現(xiàn)函數(shù)索引或者Hash索引


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10SQLServer存儲(chǔ)過程實(shí)現(xiàn)單條件分頁(yè)
- 01-10SQLServer中防止并發(fā)插入重復(fù)數(shù)據(jù)的方
- 01-10SQL Server 2012降級(jí)至2008R2的方法
- 01-10SQL Server性能調(diào)優(yōu)之緩存
- 01-10SQL Server數(shù)據(jù)庫(kù)定時(shí)自動(dòng)備份
- 01-10Sql Server 死鎖的監(jiān)控分析解決思路
- 01-10實(shí)現(xiàn)SQL Server 原生數(shù)據(jù)從XML生成JSON數(shù)
- 01-10SqlServer快速檢索某個(gè)字段在哪些存儲(chǔ)
- 01-10SqlServer 在事務(wù)中獲得自增ID的實(shí)例代
- 01-10SQLServer性能優(yōu)化--間接實(shí)現(xiàn)函數(shù)索引或
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10C#中split用法實(shí)例總結(jié)