我们经常会遇到如何摆脱整个服务器级别的参数嗅探的问题。如果您使用的是SQL Server 2017或2019,答案非常简单。SQLServer的较新版本可以为您提供和通过使用SP中的局部变量或或使用Optimize for Uknown查询提示完全相同的行为。
让我们看看如何借助“数据库范围配置–参数嗅探”来做到这一点。
数据库范围的配置–参数嗅探
有两种不同的方法可以禁用传统的参数嗅探。让我们看看这两种方法。
方法1:T-SQL
为数据库运行以下脚本,并在数据库级别禁用参数嗅探。请使用您自己的数据库名称替换数据库名称WideWorldImporters。
USE [WideWorldImporters] GO ALTER DATABASE SCOPED CONFIGURATION SET PARAMETER_SNIFFING = Off; GO
复制
方法2:通过SSMS
请参见下图,其中显示了数据库属性。在这里,您可以禁用参数嗅探。
禁用参数嗅探后,请创建以下存储过程。
-- Let us run the original stored procedure CREATE OR ALTER PROC GetCustomerOrders (@CustomerID INT) AS SELECT * FROM WideWorldImporters.Sales.Orders WHERE CustomerID = @CustomerID GO
复制
现在为您的SSMS会话启用执行计划,并使用两个不同的参数运行存储过程。
-- Sample Stored Procedure EXEC GetCustomerOrders 1060 EXEC GetCustomerOrders 90 GO
复制
您可以从执行计划中清楚地注意到,执行计划不会嗅探任何特定参数,而是以平均行数进行查询以进行统计。
再次请注意,此方法可以消除参数嗅探,但不一定可以解决性能问题。如果您确定要正确估计行数,则可以使用重新编译。但是,这种方法也有一些负面的影响。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。