濮阳杆衣贸易有限公司

主頁 > 知識庫 > SQL Server Parameter Sniffing及其改進方法

SQL Server Parameter Sniffing及其改進方法

熱門標簽:京華物流公司地圖標注 優(yōu)質(zhì)地圖標注 百度地圖標注不同路線 智能語音外呼系統(tǒng)選哪家 奧威地圖標注多個地方 怎樣在地圖上標注路線圖標 千呼電銷機器人價格 武漢長沙外呼系統(tǒng)方法和技巧 外呼系統(tǒng)電銷專用

SQL Server 在處理存儲過程的時候,為了節(jié)省編譯時間,是一次編譯,多次重用。當?shù)谝淮芜\行時代入值產(chǎn)生的執(zhí)行計劃,不適用后續(xù)代入的參數(shù)時,就產(chǎn)生了parameter sniffing問題。 create procedure Sniff1(@i int) as SELECT count(b.SalesOrderID),sum(p.weight) from [Sale
SQL Server 在處理存儲過程的時候,為了節(jié)省編譯時間,是一次編譯,多次重用。當?shù)谝淮芜\行時代入值產(chǎn)生的執(zhí)行計劃,不適用后續(xù)代入的參數(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ā)生不頻繁,只會發(fā)生在數(shù)據(jù)分布不均勻或者代入?yún)?shù)值不均勻的情況下。現(xiàn)在,我們就來探討下如何解決這類問題。

1. 使用Exec() 方式運行動態(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í)行查詢語句之前,都有SP: CacheInsert事件,SQL Server做了動態(tài)編譯,根據(jù)變量的值,都正確的預估了結(jié)果集,給出了不同的執(zhí)行計劃。

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ù)值在存儲過程語句執(zhí)行過程中得到,SQL Server在運行時不知道變量的值,會根據(jù)一個預估值進行編譯,給出一個折中的執(zhí)行計劃。

3. 使用Query Hint,指定執(zhí)行計劃

在 SELECT、DELETE、UPDATE 和 MERGE 語句最后加上OPTION ( [ ,...n ] ),對執(zhí)行計劃進行指導。當數(shù)據(jù)庫管理員知道問題所在時,可以通過hint引導SQL Server生成一個對所有變量都不太差的執(zhí)行計劃。

以上所述是小編給大家介紹的SQL Server Parameter Sniffing及其改進方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

您可能感興趣的文章:
  • SQL Server中參數(shù)化SQL寫法遇到parameter sniff ,導致不合理執(zhí)行計劃重用的快速解決方法

標簽:來賓 防疫戰(zhàn)設 銅仁 七臺河 威海 宿州 天水 益陽

巨人網(wǎng)絡通訊聲明:本文標題《SQL Server Parameter Sniffing及其改進方法》,本文關鍵詞  SQL,Server,Parameter,Sniffing,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQL Server Parameter Sniffing及其改進方法》相關的同類信息!
  • 本頁收集關于SQL Server Parameter Sniffing及其改進方法的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    白城市| 西华县| 原阳县| 赫章县| 股票| 巴南区| 得荣县| 光山县| 益阳市| 磐安县| 星座| 太白县| 玉溪市| 延津县| 西充县| 莱西市| 常宁市| 哈巴河县| 齐齐哈尔市| 吴堡县| 岳西县| 出国| 阳原县| 哈巴河县| 祁连县| 朝阳区| 克拉玛依市| 靖边县| 株洲市| 克什克腾旗| 房产| 吉首市| 岳西县| 花莲县| 泸水县| 赤水市| 霞浦县| 翁源县| 囊谦县| 定远县| 固镇县|