Mol*_*pad 11 performance sql-server statistics index-statistics
作为更广泛的收购项目的一部分,我刚刚继承了大约 20 个 SQL Server 实例。我正在评估性能,我不喜欢维护计划的实施方式。
我每天都在看到全面的索引重建(我可以处理这个)以及每天手动更新统计数据。
大约一半的数据库已设置为 Auto Update Statistics = False,原因尚不清楚,除了我被告知是为了减少“性能问题”...
我一直认为并致力于将其设置为 True 的最佳实践,并认为如果此设置为 True,则不需要手动更新。我错了吗?
任何人都可以解释将此设置为 False 的好处是什么,而是每天进行手动更新?
我应该提到一些数据库是高度事务性的(每天数百万次插入、删除、更新),其他数据库在事务率方面很低,有些几乎是只读的。虽然没有押韵或理由将自动更新设置设置为 False。好像是彩票。
Dan*_*man 11
这对于评论来说太长了,所以我将加入另一种可能想要关闭自动更新统计信息的情况。我曾使用过支持大容量 OLTP 工作负载和以毫秒为单位的严格查询性能 SLA 的数据库。几乎所有的查询都是微不足道的,需要大量关注查询和索引调整细节,有些表非常大。在这种情况下,在高峰期更新统计数据没有多大价值,自动更新统计数据会违反 SLA。因此,维护是在非高峰期通过预定作业完成的。
另一种选择是同时打开AUTO_UPDATE_STATISTICS
和AUTO_UPDATE_STATISTICS_ASYNC
数据库选项。这将允许查询根据陈旧的统计信息继续执行计划,而不是产生同步更新统计信息的开销。这尤其适用于 OLTP 工作负载,只要服务器的大小能够适应查询工作负载以及后台统计信息更新。
一般来说,我会说自动更新统计信息是有益的。但与任何设置一样,您也有理由可以打开或关闭它。
一是有些表有很多流失,可能查询对准确的统计数据不是很敏感。想想 ETL 或其他批量更改大量数据的场景,但要么不从那里读取数据,要么不大量读取。让自动统计更新启动并导致大量 I/O 提供更准确的统计数据并没有多大意义,这些统计数据永远不会被使用。
您可能还会遇到在一天中多次更新数据的情况,但不一定要在每次更新后更新统计信息。(假设仅在一天中的特定时间查询数据 - 当数据不会同时被查询时,无需多次更新统计信息。)
或者,也许您只是有大量写入的工作负载。或者读取通常是完整扫描,其中统计信息不是非常重要。
你是对的,我也相信在大多数情况下Auto Update statistics
应该设置为 true 我们应该允许 SQL Server 决定何时更新统计信息,相信我它做得很好。当它设置为 true 时,它确保更新有关字段中数据分布的统计信息,这最终将帮助优化器准备更好的计划。这里要注意的重要一点是,当表中 20% 的数据发生变化时,自动更新统计数据会触发。所以你不应该觉得在一个有 100K 行的表上,如果 10 行被更新,那么状态更新就会触发。
Paul Randal 在了解统计数据何时自动更新的博客中进行了更深入的分析。如果将此选项设置为 true,我没有看到任何缺点。是的,当此选项设置为 true 时,您可以看到一些 I/O 活动。
可以从博客中得出的重要结论是
即使统计因修改而过时,它也不会在修改完成后自动更新。该统计信息将在下次查询计划使用它时自动更新。
对于您只读取数据库或只执行选择操作而没有 DML 操作的数据库的情况,在这种情况下,您可以将选项保留为 false,但如果您保持为 true,也不会造成任何伤害。我们主要看到具有一定活动量的数据库。