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

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

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 75124;

如上一篇文章所述,使用本地变量,参数值在存储过程语句执行过程中得到,SQL Server在运行时不知道变量的值,会根据一个预估值进行编译,给出一个折中的执行计划。

3. 使用Query Hint,指定执行计划

在 SELECT、DELETE、UPDATE 和 MERGE 语句最后加上OPTION ( [ ,...n ] ),对执行计划进行指导。当数据库管理员知道问题所在时,可以通过hint引导SQL Server生成一个对所有变量都不太差的执行计划。

更多相关文章

  1. SQL Server之JSON 函数详解
  2. MySQL 5.7.9 服务无法启动-“NET HELPMSG 3534”的解决方法
  3. ES6 变量声明,箭头函数,数组方法,解构赋值,JSON,类与继承,模块化练习
  4. 浅谈Java中Collections.sort对List排序的两种方法
  5. Python list sort方法的具体使用
  6. python list.sort()根据多个关键字排序的方法实现
  7. android上一些方法的区别和用法的注意事项
  8. android实现字体闪烁动画的方法
  9. Android中dispatchDraw分析

随机推荐

  1. mysql从入门到优化(2)数据的增删改查操作总
  2. GraphQL
  3. 我司服务器上几个常用的监控工具,俺全瞟来
  4. mysql从入门到优化(4)视图的基本操作
  5. 熬夜多疯狂,体检报告就有多刺激!我怂了
  6. Android(安卓)Wifi方法大全
  7. 中年程序员的困惑
  8. 我们都是IT民工--流浪人IDE开发札记--牛
  9. 去芜湖、看房子、拿体检报告,魔幻的2021开
  10. 一个带有邮戳的锁StampedLock(jdk1.8出现)