Назад | Перейти на главную страницу

Стратегия обновления статистики после действий по обслуживанию индекса

Поскольку при перестроении индекса обновляются статистические данные для соответствующих индексов при полном сканировании, поэтому не рекомендуется обновлять статистику по этим индексам с помощью функции «Обновить статистику» с размером выборки по умолчанию. Это ухудшит собранные статистические данные. В том случае, когда мы выполняем операцию обновления статистики для всех таблиц в базе данных, является ли правильной стратегией исключение тех индексов из процесса обновления, для которых индексы уже обновлены (на основе предположения, что мы выполнение перестроений индекса перед обновлением статистики). Например, предположим, что я использую следующий курсор, чтобы получить список всех индексов в БД, для которых требуется обновление:

 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)

Если это не правильный / оптимальный способ добиться этого, не могли бы вы предложить стандартный способ сделать это.