Невикористані індекси Кращі практики


11

Виходячи з цього запиту, якщо я бачу низький обсяг прочитаних (дуже близький до 0 або 0, як-от 1 або 2) і високий або помірний кількість оновлень користувачів (я не міг знайти вставок або видалення за допомогою цього запиту) з велика кількість рядків, я теоретично повинен видалити індекс.

SELECT DISTINCT
    OBJECT_NAME(s.[object_id]) AS ObjectName
       , p.rows TableRows
       , i.name AS [INDEX NAME]
       , (user_seeks + user_scans + user_lookups) AS TotalReads
       , user_updates UserUpdates
FROM sys.dm_db_index_usage_stats s
    INNER JOIN sys.indexes i ON i.[object_id] = s.[object_id] 
        AND i.index_id = s.index_id 
    INNER JOIN sys.partitions p ON p.object_id = i.object_id
WHERE OBJECTPROPERTY(s.[object_id],'IsUserTable') = 1
       AND s.database_id = DB_ID()
       AND i.name IS NOT NULL
ORDER BY (user_seeks + user_scans + user_lookups) ASC

Я хочу перехресно перевірити тут точність цього припущення. Наприклад, індекс, який існував більше року, але його ніколи не читали, але сильно оновлювали, здається, це було б поганою ідеєю. Чи існує сценарій, коли це припущення є недійсним?

Відповіді:


15

Цей DMV підтримує лише статистику з моменту останнього перезавантаження SQL Server; погляд повністю стирається, і все починається з нуля.

Що ще важливіше, рядки в цьому поданні для будь-якого конкретного індексу видаляються, коли цей індекс перебудовується (але не тоді, коли він реорганізований). Якщо ви виконуєте регулярне обслуговування індексів, може бути корисним переглянути журнали технічного обслуговування та побачити, чи не вдалося відновити будь-який з індексів, які ви розглядаєте, як було скинуто недавно.

Отже, прийняття рішень на основі низьких показників з моменту останнього перезавантаження, коли останній перезапуск може бути для оновлених останніх тижнів виправлень патч або оновленого пакета обслуговування вчорашнього дня, може бути нерозумним. Або коли ви виконуєте обслуговування індексу, починаючи з останньої перебудови. Може бути звіт, який проводиться лише раз на місяць, або раз на квартал, або раз на рік, і його веде важлива та нетерпляча людина.

Крім того, індекс може бути там, що станеться в майбутньому, про яке ви не знаєте - серія звітів готується до податкового сезону, скажімо.

Отже, моя порада:

Використовуйте DMV для ідентифікації кандидатських індексів для видалення , але не приймайте це рішення бульбашкою - вам потрібно зробити обробку ніг, щоб визначити, чому індекс може існувати, перш ніж скидати його, навіть якщо він виглядає так, що він зараз не використовується .


@AaronBertrand Тож чи відстеження історії (разом із часом останнього перезавантаження) буде хорошим доповненням до цього? Дякую за відповідь
DoubleVu

1
@DoubleVu так, збереження знімків історії використання індексу, ймовірно, доцільно, щоб ви могли приймати освічені рішення, на які не впливає нічого, що може змінити вихід даних статистики використання DMV.
Аарон Бертран

2

У виду є лише статистика з часу останнього перезавантаження. Щоб полегшити ситуацію, я налаштував завдання, яке проводило запит, як той, який ви розміщували щомісяця вранці, перш ніж наше вікно технічного обслуговування почало збирати інформацію щомісяця перед перезавантаженням сервера. Це дозволило мені повернутися далі і подивитися на тенденції з часом. У мене також був другий запит, який запускався, шукаючи, можливо, відсутні індекси.

Інша річ, яку слід врахувати, - це те, які інші індекси є на столі. Він може не звикнути, оскільки це здебільшого або повністю копія іншого індексу. Так. SQL-сервер дозволяє створювати два різних, але однакові індекси, так що цілком можливо, щоб він був зайвим.

Ви також можете ознайомитись з тим, чим може бути план запиту для запиту, який використовував цей індекс, якщо цей індекс буде видалено. Чи буде у нього інший індекс, або він, ймовірно, повинен повернутися до повного сканування таблиці.

Покажчики виявляються такими ж мистецтвом, як і наукою, тому що насправді важко знати все про те, що може бути запущено, і все одно часто змінюється.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.