Indexing 在索引维护活动后更新统计策略

Indexing 在索引维护活动后更新统计策略,indexing,statistics,maintenance,Indexing,Statistics,Maintenance,由于索引重建将使用完全扫描更新相关索引的统计数据,因此不建议使用具有默认样本大小的更新统计信息更新这些索引的统计信息。这将使捕获的统计数据更加糟糕。在这种情况下,当我们对数据库中的所有表执行统计信息更新操作时,从更新过程中删除这些索引是否是正确的策略,因为这些索引已经是最新的(基于我们在统计信息更新之前运行索引重建的假设)。例如,假设我使用以下游标获取数据库中需要更新的所有索引的列表: SET @index_names = CURSOR LOCAL FAST_FORWARD READ_ONLY

由于索引重建将使用完全扫描更新相关索引的统计数据,因此不建议使用具有默认样本大小的更新统计信息更新这些索引的统计信息。这将使捕获的统计数据更加糟糕。在这种情况下,当我们对数据库中的所有表执行统计信息更新操作时,从更新过程中删除这些索引是否是正确的策略,因为这些索引已经是最新的(基于我们在统计信息更新之前运行索引重建的假设)。例如,假设我使用以下游标获取数据库中需要更新的所有索引的列表:

SET @index_names = CURSOR LOCAL FAST_FORWARD READ_ONLY
FOR
    SELECT NAME ,indid ,rowmodctr
    FROM sys.sysindexes
        WHERE id = @table_id
        AND indid > 0
    ORDER BY indid
并使用以下条件检查是否需要更新统计信息:

IF ((@ind_rowmodctr <> 0))
IF(@ind_rowmodctr 0))
但这将更新所有索引的统计信息,而不管某个索引是否已因重建而更新了其统计信息

现在假设我们在同一天按顺序运行Index Rebuild任务和statistics update任务,我们是否可以使用以下筛选器删除已重建的索引:

SELECT NAME AS index_name
    ,CONVERT(VARCHAR(10), STATS_DATE(object_id, index_id), 111) AS statistics_update_date
FROM sys.indexes
WHERE object_id = OBJECT_ID('CM_Project')
    AND CONVERT(VARCHAR(10), STATS_DATE(object_id, index_id), 111) <> CONVERT(VARCHAR(10), GETDATE(), 111)
选择名称作为索引\u名称
,将(VARCHAR(10),STATS_DATE(object_id,index_id),111)转换为statistics_update_DATE
从sys.index
其中object\u id=object\u id('CM\u Project')
和CONVERT(VARCHAR(10),STATS_DATE(object_id,index_id),111)CONVERT(VARCHAR(10),GETDATE(),111)
如果这不是实现这一目标的正确/最佳方法,请您建议一种标准方法

谢谢。 苏美亚