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