我有一个查询,涉及 14 亿行的表。
此查询一切运行正常,运行时间不到一秒。
然后大约每 5 天一次,自动更新统计数据开始启动,查询开始运行近 60 秒 - 它采用不同的计划。
我检查了一下,当自动更新统计数据开始时,采样率低于表格的 1%。
现在,我的问题是 - 自动更新统计数据是否会导致优化程序选择比以前更糟糕的计划?
我可以看到,糟糕计划的估计与好计划的估计有很大不同。
好计划:
坏计划:
对于糟糕的计划来说,估计显然是错误的,但查询返回的行数是相同的。
此时,我想确认自动统计更新是否可以做到这一点?
我现在尝试使用 10% 的样本进行统计数据更新,然后观察会发生什么。
更新: 我已经完成了 10% 采样率的统计更新,查询再次运行良好。
已将此工作定期进行。
显然可以。你现在就正在经历它。
对于一些较大的表,默认的采样率太低。
如果您使用的是 SQL Server 2016 或更高版本,则可以使用语法创建或更新统计信息以
PERSIST_SAMPLE_PERCENT
覆盖默认方法并保持最低采样率。您只需弄清楚需要什么即可。如果您使用的是旧版本,或者由于其他交互上述操作不适合您,您可以
NORECOMPUTE
按照您认为理想的采样率手动更新统计数据并处理统计数据更新。