Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как опрделить не нужные индексы  [new]
stinggga
Member

Откуда:
Сообщений: 416
Уважаемые, форумчане.

Есть большая таблица в ней куча индексов. Как возможно почистить от не нужных? Может есть какае-то методика ? Или только скриптуя базу и искать поля которые используются в ХРПР?
22 май 17, 15:11    [20501521]     Ответить | Цитировать Сообщить модератору
 Re: Как опрделить не нужные индексы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36694
Помониторить sys.dm_db_index_operational_stats некоторе время. И быть готовым к тому, что может вылезти запрос, который запускают раз в пол года, который без индексов все положит.

Короче, оно вам зачем надо?
22 май 17, 15:16    [20501535]     Ответить | Цитировать Сообщить модератору
 Re: Как опрделить не нужные индексы  [new]
stinggga
Member

Откуда:
Сообщений: 416
Гавриленко Сергей Алексеевич
Помониторить sys.dm_db_index_operational_stats некоторе время. И быть готовым к тому, что может вылезти запрос, который запускают раз в пол года, который без индексов все положит.

Короче, оно вам зачем надо?


Всё же надо почистить. Такой таблицы sys.dm_db_index_operational_stats не нахожу. Не в служебных БД не в необходимой. У меня 12 sql
22 май 17, 15:19    [20501548]     Ответить | Цитировать Сообщить модератору
 Re: Как опрделить не нужные индексы  [new]
msLex
Member

Откуда:
Сообщений: 7730
sys.dm_db_index_usage_stats
22 май 17, 15:20    [20501554]     Ответить | Цитировать Сообщить модератору
 Re: Как опрделить не нужные индексы  [new]
stinggga
Member

Откуда:
Сообщений: 416
stinggga,

Пардон это ХПР
22 май 17, 15:21    [20501556]     Ответить | Цитировать Сообщить модератору
 Re: Как опрделить не нужные индексы  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
SELECT o.name
     , index_name = i.name
     , [index_columns] = STUFF((
         SELECT ', ' + COL_NAME(ic.[object_id], ic.column_id) + IIF(ic.is_descending_key = 1, ' (DESC)', '')
         FROM sys.index_columns ic
         WHERE ic.[object_id] = i.[object_id]
             AND ic.index_id = i.index_id
             AND ic.is_included_column = 0
         FOR XML PATH('')), 1, 2, '')
     , included_columns = STUFF((
         SELECT ', ' + COL_NAME(ic.[object_id], ic.column_id)
         FROM sys.index_columns ic
         WHERE ic.[object_id] = i.[object_id]
             AND ic.index_id = i.index_id
             AND ic.is_included_column = 1
         FOR XML PATH('')), 1, 2, '') 
     , i.[type_desc]
     , us.user_seeks
     , us.user_scans
     , us.user_lookups
     , us.user_updates
     , last_user_update
     , us.last_action_read
FROM sys.indexes i
JOIN sys.objects o ON i.[object_id] = o.[object_id]
LEFT JOIN (
    SELECT *, last_action_read = (
                SELECT MAX(last_action)
                FROM (VALUES (last_user_seek), (last_user_scan), (last_user_lookup)) t(last_action)
            )
    FROM sys.dm_db_index_usage_stats
    WHERE database_id = DB_ID()
) us ON us.index_id = i.index_id AND i.[object_id] = us.[object_id]
WHERE o.[type] IN ('U', 'V')
    AND o.is_ms_shipped = 0

Смотрите на цифры с целью определить как часто и когда последний раз индекс использовался, а там дальше уже решаете. Нужен он или нет. Можно еще парсить планы в кеше и смотреть какие индексы используются, но это уже явно печаль. Универсального решения нет.
22 май 17, 15:22    [20501564]     Ответить | Цитировать Сообщить модератору
 Re: Как опрделить не нужные индексы  [new]
stinggga
Member

Откуда:
Сообщений: 416
AlanDenton,

Спасибо. то что нужно
22 май 17, 15:30    [20501599]     Ответить | Цитировать Сообщить модератору
 Re: Как опрделить не нужные индексы  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
stinggga, пожалуйста. Не забывайте что до 2014 SP не помню какого и ниже, при ребилде индекса статистика из dm_db_index_usage_stats сбрасывалась в ноль. Так что аккуратно :)
22 май 17, 15:33    [20501614]     Ответить | Цитировать Сообщить модератору
 Re: Как опрделить не нужные индексы  [new]
o-o
Guest
AlanDenton
stinggga, пожалуйста. Не забывайте что до 2014 SP не помню какого и ниже, при ребилде индекса статистика из dm_db_index_usage_stats сбрасывалась в ноль. Так что аккуратно :)

а заодно и при переводе базы в оффлайн.
так что автоклоузные базы в пролете
и те, от которых юзеров отцепляют переводом в оффлайн
22 май 17, 15:55    [20501703]     Ответить | Цитировать Сообщить модератору
 Re: Как опрделить не нужные индексы  [new]
Basma4
Member

Откуда:
Сообщений: 124
для начала нужно проверить на наличие дубликатов

https://www.sqlskills.com/blogs/kimberly/removing-duplicate-indexes

затем пособирать статистику использования в течении определенного периода (день\неделя\месяц\год)

https://www.sqlskills.com/blogs/paul/indexes-from-every-angle-how-can-you-tell-if-an-index-is-being-used
23 май 17, 09:31    [20503145]     Ответить | Цитировать Сообщить модератору
 Re: Как опрделить не нужные индексы  [new]
aleksrov
Member

Откуда:
Сообщений: 948
stinggga
Еще это статистика сбрасывается при перезапуске сервера, и если как у многих "хороших" админов у вас есть привычка перезагружать сервак когда все тормозит то это будут бесполезные цифры.
Часто есть запросы которые запускаются раз в квартал, полугодие, год, и они могут использовать эти индексы.
Хотите поробывать? Не удаляйте, отключите. Мы так делали, а когда через год или около того, когда все отчетные периоды прошли, а сервак дергался лишь раз или два, на нас никто не наехал почему вдруг все так медленно, мы их удалили.
23 май 17, 09:51    [20503211]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить