我有一个分区表,它包含一个行存储主键和一个非聚集列存储索引。这两个索引的前导键(虽然键的顺序对列存储来说并不重要)相同。更新统计信息时,SQL Server 会定期选择扫描列存储索引。这对我来说太耗时了,所以我尝试了
UPDATE STATISTICS My_Table
WITH PERSIST_SAMPLE_PERCENT = ON, SAMPLE 3 PERCENT
令我惊讶的是,统计信息更新仍然花费了很长时间。执行计划表明,列存储索引的扫描方式与之前相同。
所以,我有一个问题:从列存储索引读取时,UPDATE STATISTICS 中会忽略 PERSIST_SAMPLE_PERCENT 吗?自动统计信息更新似乎也存在这个问题。
更新:我怀疑实际上可能是删除的位图导致所有这一切出错。
这几乎可以肯定是因为我研究的表碎片严重。这些残酷的实验表明,执行计划准确地报告了列存储索引的采样率,并且这些采样率与已持久化的采样率相匹配。然而,auto_stats 扩展事件似乎不那么诚实。
UPDATE STATISTICS
您可以在运行代码后,通过运行以下查询轻松测试这一点PERSIST_SAMPLE_PERCENT = ON
。您可以查看Rows
、NumberofSamplingrows
并SamplePercent
进行简单的数学运算来计算已采样的行百分比。它还会在PersistedSamplePercent
列中显示您的“持久采样百分比”。有时您可能会有 1% 的误差(尤其是在记录数较少的表上)。参考:Rajendra Gupta 的“持久化 SQL Server 统计信息自动更新采样率”