在 SQL Server 2012 SP1 实例中,我在表的 PK 列上有一个筛选索引,如下所示:
CREATE INDEX [RF_IXF_Orders_OrderNumber] ON [dbo].[Orders]
(
[OrderNumber] ASC
)
WHERE [OrderSource]='MO'
AND [Cancelled]=(0)
AND [NumItems]>(0)
AND [OrderDate]>'2014-05-15';
索引的 Row Count (dm_db_partition_stats.row_count) 为 8416,Rows Changed (sysindexes.rowmodctr) 为 16803 (193.6%),Auto Update Statistics 为 True。已有 8400 次 user_scans 和 50,088 次 user_updates。最后一次 user_scan 是今天,但统计数据已经大约一周没有更新了。
为什么统计数据不会自动更新?
过滤索引/统计数据中的致命缺陷:流失率是通过表的行计数百分比来衡量的,而不是索引/统计数据。转述自我的博客文章:
您不应该依赖过滤对象的自动更新统计信息。如果基数很重要并且子集的变化比整个表的变化多得多,您将需要手动管理这些。