暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL Server数据库范围配置–参数嗅探

原创 Pinal Dave 2019-12-31
2020

image.png

我们经常会遇到如何摆脱整个服务器级别的参数嗅探的问题。如果您使用的是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
复制

您可以从执行计划中清楚地注意到,执行计划不会嗅探任何特定参数,而是以平均行数进行查询以进行统计。

image.png

再次请注意,此方法可以消除参数嗅探,但不一定可以解决性能问题。如果您确定要正确估计行数,则可以使用重新编译。但是,这种方法也有一些负面的影响。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论