首页 > 代码库 > 参数探测(Parameter Sniffing)影响存储过程执行效率

参数探测(Parameter Sniffing)影响存储过程执行效率

如果SQL query中有参数,SQL Server 会创建一个参数嗅探进程以提高执行性能。该计划通常是最好的并被保存以重复利用。只是偶尔,不会选择最优的执行计划而影响执行效率。

SQL Server尝试通过创建编译执行计划来优化你的存储过程的执行。通常是在第一次执行存储过程时候会生成并缓存查询执行计划。当SQL Server数据库引擎编译存储过程中侦测到有参数值传递进来的时候,会创建基于这些参数的执行计划。这种在编译存储过程中侦测参数值的方法,通常被称为“参数探测”。有时参数探测会产生效率低下的执行计划;特别是当一个存储过程调用与具有不同的基数的参数值。

什么是参数探测

探测一词就显示出了更多的不可靠性,有时候会产生好的结果就不可避免的产生一些坏的结果。参数探测是在SQL Serve通过第一次执行时调用的参数创建的最优的执行计划。 这个第一次是指不管你执行或者是重新编译因为在缓存中没有一个现成的执行计划存在。以后使用相同的参数调用同一个存储过程的时候同样会得到一个最佳的执行方案。但是使用不同的参数的时候可能得不到最佳的方案,就是坏的结果。

并不是所有的执行计划是平等的,执行计划会按照要做什么进行一些必要的优化。SQL server再去选择并确定最优的执行策略。它着眼于做什么样的查询,使用参数值来看看统计数据,做了那些计算,最终决定通过哪些步骤来解决查询。这是如何创建一个执行计划的比较简单的解释。对我们来说,重要的一点是,SQL Server通过这些参数用来确定如何处理查询。一组参数的最优执行计划可能是一个索引扫描操作,而另一组参数可能使用索引查找能更好地解决。

禁用参数探测

既然参数探测会带来不确定的因素,我们可以通过使用本地变量来禁止参数探测。

比如:

create procedure TestingSP(@CustID varchar(20)) as begin declare @LocCustID varchar(20) set @LocCustID = @CustIDselect * from orders where customerid = @LocCustID end

 

归纳总结
参数探测(Parameter Sniffing)可以在存储过程级别上启用或禁用;
如果检索的数据列基本上平均分布,我们不必使用本地变量(禁用Parameter Sniffing);例如,查询主键列或唯一键列(Unique Key);
如果检索的数据列分布很大,则可以使用本地变量,禁用参数探测(Parameter Sniffing);

参数探测(Parameter Sniffing)影响存储过程执行效率