我正在对一项作业的性能问题进行故障排除,该作业在 SQL Server 2019 上完成的时间比 2012 年运行时的时间长了 5 小时。
该作业有问题的步骤之一是在批量加载到操作数据存储类型的数据库 (ODS) 期间,该数据库从不同源获取数据并插入到每晚截断并重新加载的表中,索引在加载之前被禁用它们最终会被一一按名字重建,而不是全部重建。
尽管表中有四个禁用的索引,但我看到它们的相关统计信息仍在每天更新:
统计 | 统计类型 | 被禁用 | 统计数据上次更新 | 行数 | 采样行数 | 未过滤的行 | 行修改 | 直方图步骤 |
---|---|---|---|---|---|---|---|---|
IX_1 | 指数统计 | 是的 | 2023-07-27 03:07:00.4566667 | 238634988 | 617299 | 238634988 | 4963 | 3 |
IX_2 | 指数统计 | 是的 | 2023-07-27 03:07:24.8866667 | 238634988 | 617299 | 238634988 | 4963 | 200 |
IX_3 | 指数统计 | 是的 | 2023-07-27 08:29:01.5266667 | 238634988 | 617290 | 238634988 | 4963 | 199 |
IX_4 | 指数统计 | 是的 | 2023-07-27 03:07:34.0233333 | 238634988 | 617299 | 238634988 | 4963 | 192 |
此外,我还发现一些查询的执行计划考虑了禁用索引中的这些统计信息,这正常吗?
<OptimizerStatsUsage>
<StatisticsInfo Database="[x]" Schema="[dbo]" Table="[y]" Statistics="[IX_3]" ModificationCount="22" SamplingPercent="0.257925" LastUpdate="2023-07-20T09:51:44.88" />
<StatisticsInfo Database="[x]" Schema="[dbo]" Table="[y]" Statistics="[IX_2]" ModificationCount="0" SamplingPercent="0.257925" LastUpdate="2023-07-20T03:28:08.59" />
由于该数据库每天都会截断和加载表的性质,我是否应该为整个数据库或某些表关闭 AUTO_UPDATE_STATISTICS ?
当我查询 sys.dm_db_stats_properties 时,有许多自动创建的统计信息,其中包含超过 2 亿行修改。
任何意见将不胜感激,谢谢!
首先,尝试通过删除/重新创建而不是禁用/启用来从等式中排除四个禁用的索引。
如果响应时间没有改变,那么这些索引不负责。还启用查询存储来获取最昂贵的查询,并等待与这些查询相关的操作以找到您的问题子项。
我不认为禁用 AUTO_UPDATE_STATISTICS 对您有帮助。