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