Joh*_*ell 11 sql-server statistics execution-plan sql-server-2012
我试图更好地理解(从概念上)统计、执行计划、存储过程执行之间的关系。
我说统计信息仅在为存储过程创建执行计划时使用,而在实际执行上下文中不使用,我说的对吗?换句话说,如果这是真的,一旦创建了计划(并假设它被正确重用),“最新”统计数据有多重要?
我读过的一篇文章(统计、行估计和升序日期列)特别激励我,该文章描述的场景与我每天面对的几个客户数据库非常相似。
在我们使用特定存储过程定期查询的最大表之一中,我们有一个升序日期/时间列。
当您每天添加十万行时,您如何防止执行计划变得陈旧?
如果我们经常更新统计信息来解决这个问题,在这个存储过程的查询中使用 OPTION (RECOMPILE) 提示是否有意义?
任何意见或建议将不胜感激。
更新:我使用的是 SQL Server 2012 (SP1)。
我说统计信息仅在创建执行计划时使用是否正确
不,过时的统计数据可能会导致受影响语句的优化相关重新编译。
我们在定期查询的最大表之一中有一个升序日期/时间列
由于谓词值超出(特别是高于)存储在相应统计直方图中的值范围而导致的次优执行计划被称为Ascending Key Problem。重建统计数据是一种可能的解决方案,但它可能非常耗费资源。替代方案包括:
跟踪标志 2389 和 2390。这要求存在以有问题的列作为前导键的索引。它不适用于分区表,并且仅在使用原始基数估计器时才在 SQL Server 2014 中有效。如果统计对象标记为固定的,则可能还需要跟踪标志 4139。
升级到 SQL Server 2014。新的基数估计器包括使用平均密度信息估计超出直方图的逻辑。在某些重要情况下,这可能不如2389/2390 跟踪标志准确。
为带有跟踪标志 2371 的大表启用更频繁的自动统计更新。使用此跟踪标志,无需在 20% + 500 次更改后更新,只需SQRT(1000 * Table rows)进行修改。这不像前面提到的那样完整,因为更新可能仍然不够频繁地触发。
如果问题的根源不是基于超出直方图谓词值的频繁计划编译,而是更多关于由于参数嗅探而偶尔缓存这种糟糕计划的影响,您还可以考虑:
OPTIMIZE FOR (@parameter = value)编译一个计划,一个已知的代表值OPTIMIZE FOR (@parameter UNKNOWN)平均分布进行优化OPTIMIZE FOR UNKNOWN(与 4136 相同,但每个查询)OPTION (RECOMPILE)编译每次嗅探特定值。如果绝大多数运行时值都在直方图中,这可能是有效的。有关参数嗅探、嵌入和重新编译选项的更多信息,请参阅我在 SQLperformance.com 上的文章。
我说统计信息仅在为存储过程创建执行计划时使用,而在实际执行上下文中不使用,我说的对吗?
不,会发生什么是存储过程的执行计划被缓存。假设有足够的可用内存来继续保存计划,除非发生以下情况之一,否则它不会更改(来自SQL Server 文档中的执行计划缓存和重用,强调已添加):
- 对查询引用的表或视图所做的更改(ALTER TABLE 和 ALTER VIEW)。
- 对单个过程所做的更改,这将从缓存中删除该过程的所有计划 (ALTER PROCEDURE)。
- 对执行计划使用的任何索引的更改。
- 执行计划使用的统计信息的更新,从语句显式生成,例如 UPDATE STATISTICS,或自动生成。
- 删除执行计划使用的索引。
- 对 sp_recompile 的显式调用。
- 对键的大量更改(由修改查询引用的表的其他用户的 INSERT 或 DELETE 语句生成)。
- 对于带有触发器的表,如果插入或删除的表中的行数显着增长。
- 使用 WITH RECOMPILE 选项执行存储过程。
因此,如果更新了统计信息,缓存计划将自动考虑新的统计信息并重新编译。
当您每天添加十万行时,您如何防止执行计划变得陈旧?
一种方法是如果表格有很多更新,如上所述。几十万改变的行可能满足这个条件。但是,如果您想确定或更精细的控制:通过更新您的统计数据。您可以允许 SQL Server 自动创建和管理统计信息,或自己手动完成。您可以在SQL Server Auto Update 和 Auto Create Statistics Options 中找到有关任一方法的更多信息。当/如果您每周重建索引,这也将触发更新计划。做一些测试,看看什么对你最有益,因为过于频繁地更新统计数据可能不会产生任何实际的性能结果。
如果我们经常更新统计信息来解决这个问题,在这个存储过程的查询中使用 OPTION (RECOMPILE) 提示是否有意义?
您不需要使用RECOMPILE,因为根据上面的摘录,您可以看到只要有新的统计数据可用,执行计划就会得到适当的更新。您可能对一天结束的统计数据更新没问题(如果您真的很担心),但我认为根据您到目前为止所说的内容,这不是明确的需要。不过,我会再次测试它以查看这可能对您的存储过程性能产生什么影响并相应地进行计划。