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

默认情况下关闭SQL Server数据库的参数嗅探

原创 Greg Larsen 2019-12-10
977

随着时间的推移,您对同一个查询的执行时间有很大不同吗?如果是这样,您可能正在经历所谓的“参数嗅探”。编译查询时,查询优化器将使用参数嗅探。优化器嗅探,它基本上是在查看要执行的查询文本以及正在传递的参数。如果查询文本和参数与现有的已编译查询计划相似,则SQL Server可能会考虑使用现有的计划来运行查询。它这样做是为了加快查询速度,而不是将类似的查询重新编译为已在缓存中的查询计划。编译查询会占用宝贵的资源。

参数嗅探的问题在于所有相似的查询可能需要不同的执行计划才能有效运行。例如,假设您要搜索一组具有特定日期范围的记录。如果日期范围仅几天,则SQL Server将只需要返回一小组记录。但是,如果数据范围涵盖几年,则SQL Server将返回比一个月数据范围的查询多得多的记录。一个优化的执行计划(最有可能返回一个月的记录)在返回几年的记录方面效率很低。但是由于默认情况下参数嗅探是打开的,所以这两个查询可能使用相同的计划。

如前所述,默认情况下,参数sniff处于打开状态。但是在某些情况下,您可能不想为所有数据库打开参数嗅探。因此,在SQL Server 2016中,Microsoft决定提供新的数据库作用域配置,该配置使您可以关闭特定数据库的参数嗅探。要确定特定数据库的数据库范围配置,请在相关数据库的上下文中运行以下命令:

SELECT * FROM sys.database_scoped_configurations;
运行此命令时,您可能会看到以下内容:

image.png

在这里,您可以看到我当前的数据库的PARAMETER_SNIFFING值为“ 1”。这意味着参数嗅探功能已打开。

如果要关闭该数据库的参数嗅探,我需要做的就是运行以下命令:

ALTER DATABASE SCOPED CONFIGURATION SET PARAMETER_SNIFFING = OFF;

如果运行此命令后检查数据库范围配置,则可以看到PARAMETER_SNIFFING参数值现在为零(“ 0”):
image.png

关闭参数嗅探功能后,SQL Server将基于可用于每个查询的统计信息来构建查询计划。这可能对您的工作流程很有帮助,但随后可能没有帮助。如果打算关闭参数嗅探,请记住在进行基准测试之前和之后进行基准测试,以确定哪种设置可以为您的环境提供最佳性能。

来源:默认情况下关闭SQL Server数据库的参数嗅探
https://www.databasejournal.com/features/mssql/turning-off-parameter-sniffing-for-a-sql-server-database-by-default.html

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

文章被以下合辑收录

评论