国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

SQL Server Parameter Sniffing及其改進方法

2024-08-31 01:04:58
字體:
來源:轉載
供稿:網友

SQL Server 在處理存儲過程的時候,為了節省編譯時間,是一次編譯,多次重用。當第一次運行時代入值產生的執行計劃,不適用后續代入的參數時,就產生了parameter sniffing問題。 create procedure Sniff1(@i int) as SELECT count(b.SalesOrderID),sum(p.weight) from [Sale
SQL Server 在處理存儲過程的時候,為了節省編譯時間,是一次編譯,多次重用。當第一次運行時代入值產生的執行計劃,不適用后續代入的參數時,就產生了parameter sniffing問題。

create procedure Sniff1(@i int) as SELECT count(b.SalesOrderID),sum(p.weight) from [Sales].[SalesOrderHeader] ainner join [Sales].[SalesOrderDetail] bon a.SalesOrderID = b.SalesOrderIDinner join Production.Product pon b.ProductID = p.ProductIDwhere a.SalesOrderID =@i;goDBCC FREEPROCCACHEexec Sniff1 50000;exec Sniff1 75124;go

SQLServer,Parameter,Sniffing

Parameter Sniffing問題發生不頻繁,只會發生在數據分布不均勻或者代入參數值不均勻的情況下。現在,我們就來探討下如何解決這類問題。

1. 使用Exec() 方式運行動態SQL

create procedure Nosniff1(@i int) as declare @cmd varchar(1000);set @cmd = 'SELECT count(b.SalesOrderID),sum(p.weight) from [Sales].[SalesOrderHeader] ainner join [Sales].[SalesOrderDetail] bon a.SalesOrderID = b.SalesOrderIDinner join Production.Product pon b.ProductID = p.ProductIDwhere a.SalesOrderID ='; exec(@cmd+@i); go

SQLServer,Parameter,Sniffing

exec Nosniff1 50000;

SQLServer,Parameter,Sniffing

exec Nosniff1 75124;

從上述trace中可以看到,在執行查詢語句之前,都有SP: CacheInsert事件,SQL Server做了動態編譯,根據變量的值,都正確的預估了結果集,給出了不同的執行計劃。

2. 使用本地變量

create procedure Nosniff2(@i int) as declare @iin int;set @iin=@iSELECT count(b.SalesOrderID),sum(p.weight) from [Sales].[SalesOrderHeader] ainner join [Sales].[SalesOrderDetail] bon a.SalesOrderID = b.SalesOrderIDinner join Production.Product pon b.ProductID = p.ProductIDwhere a.SalesOrderID =@iin;go

exec Nosniff2 50000;

SQLServer,Parameter,Sniffing

SQLServer,Parameter,Sniffing

exec Nosniff2 75124;

SQLServer,Parameter,Sniffing

SQLServer,Parameter,Sniffing

如上一篇文章所述,使用本地變量,參數值在存儲過程語句執行過程中得到,SQL Server在運行時不知道變量的值,會根據一個預估值進行編譯,給出一個折中的執行計劃。

3. 使用Query Hint,指定執行計劃

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

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


注:相關教程知識閱讀請移步到MSSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鄱阳县| 闸北区| 丹东市| 宣城市| 尖扎县| 保山市| 沁源县| 福贡县| 青冈县| 桐柏县| 武定县| 布尔津县| 微山县| 峡江县| 汶川县| 册亨县| 永川市| 宁都县| 星子县| 建昌县| 阿拉善左旗| 始兴县| 社旗县| 蒙山县| 黄大仙区| 南漳县| 健康| 长汀县| 神木县| 太仆寺旗| 洪江市| 同德县| 眉山市| 碌曲县| 施甸县| 奉贤区| 恩施市| 孟津县| 灵川县| 岳西县| 乌鲁木齐市|