由于Index Rebuilds将使用完全扫描更新相关索引的统计数据,因此不建议使用具有默认样本大小的Update Statistics更新这些索引的统计信息。这将使捕获的统计数据恶化。在这种情况下,当我们对数据库中的所有表执行统计更新操作时,从索引已经是最新的更新过程中消除那些索引是否是正确的策略(基于我们的假设)在统计信息更新之前运行索引重建)。例如,假设我使用以下游标来获取需要更新的数据库中所有索引的列表:
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))
但是这将更新所有索引的统计信息,而不管索引是否因重建而更新了统计信息。
现在假设我们在同一天按顺序运行索引重建任务和统计信息更新任务,我们是否可以使用以下过滤器来消除已经重建的索引:
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)
如果这不是实现此目的的正确/最佳方式,请您建议一种标准方法来完成此任务。
感谢。 Soumya