为什么此统计信息不针对过滤索引自动更新?

Mar*_*man 3 statistics sql-server-2012

在 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';
Run Code Online (Sandbox Code Playgroud)

索引的 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 是今天,但统计数据已经大约一周没有更新了。

为什么统计数据不会自动更新?

Aar*_*and 6

过滤索引/统计数据中的致命缺陷:流失是通过的行数百分比来衡量的,而不是索引/统计数据。从我的博客文章中转述:

基于过滤谓词识别的表子集的百分比变化自动更新统计数据,过滤索引不会受益;它基于(像所有未过滤的索引一样)对整个表的流失。这意味着,根据过滤索引中表的百分比,索引中的行数可能会增加四倍或一半,并且统计信息不会更新,除非您手动更新。Kimberly Tripp 提供了一些关于这方面的重要信息(Gail Shaw 举了一个例子,在更新仅包含 10,000 行的过滤索引的统计信息之前需要进行 257,000 次更新):http :

//www.sqlskills.com/blogs/kimberly/过滤索引和过滤统计数据可能会变得严重过时/

此外,Joe Sack 提交了一个 Connect 项目,建议针对过滤索引和过滤统计数据更正此行为:http :

//connect.microsoft.com/SQLServer/feedback/details/509638

您不应该依赖过滤对象的自动更新统计信息。如果基数很重要,并且子集的变化比整个表的变化大很多,您将需要手动管理这些。