HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: базы данных, sql, управление базами данных, sql server, dmv, индексы</p>
1 <p>Теги: базы данных, sql, управление базами данных, sql server, dmv, индексы</p>
2 <p>В этом нам поможет замечательная<strong>DMV</strong>sys.dm_db_index_usage_stats. В ней есть информация о том, сколько раз используется индекс при поиске (user_seeks, user_scans и user_lookups), и о том, сколько раз нужно обновить данные в индексе при изменении данных в таблице (user_updates).</p>
2 <p>В этом нам поможет замечательная<strong>DMV</strong>sys.dm_db_index_usage_stats. В ней есть информация о том, сколько раз используется индекс при поиске (user_seeks, user_scans и user_lookups), и о том, сколько раз нужно обновить данные в индексе при изменении данных в таблице (user_updates).</p>
3 <p>Первое поле - коэффициент полезности индекса. Чем он выше, тем чаще индекс используется при поиске и реже при обновлениях. Осторожно, статистика использования индексов сбрасывается при рестарте сервера, поэтому если вы недавно перезапускали<strong>SQL Server</strong>, лучше подождите и дайте время накопиться статистике.</p>
3 <p>Первое поле - коэффициент полезности индекса. Чем он выше, тем чаще индекс используется при поиске и реже при обновлениях. Осторожно, статистика использования индексов сбрасывается при рестарте сервера, поэтому если вы недавно перезапускали<strong>SQL Server</strong>, лучше подождите и дайте время накопиться статистике.</p>
4 declare @dbid int select @dbid = db_id() select (cast((user_seeks + user_scans + user_lookups) as float) / case user_updates when 0 then 1.0 else cast(user_updates as float) end) * 100 as [%] , (user_seeks + user_scans + user_lookups) AS total_usage , objectname=object_name(s.object_id), s.object_id , indexname=i.name, i.index_id , user_seeks, user_scans, user_lookups, user_updates , last_user_seek, last_user_scan, last_user_update , last_system_seek, last_system_scan, last_system_update , 'DROP INDEX ' + i.name + ' ON ' + object_name(s.object_id) as [Command], i.* from sys.dm_db_index_usage_stats s, sys.indexes i where database_id = @dbid and objectproperty(s.object_id,'IsUserTable') = 1 and i.object_id = s.object_id and i.index_id = s.index_id AND i.name IS NOT NULL AND i.is_primary_key = 0 --исключаем Primary Key AND i.is_unique_constraint = 0 --исключаем Constraints --and object_name(s.object_id) = 'MyBigTable' order by [%] asc<p>Я не рекомендую сразу идти и удалять индексы, которые не используются, но нужно обратить внимание на них и посмотреть кто, когда и зачем их создал.</p>
4 declare @dbid int select @dbid = db_id() select (cast((user_seeks + user_scans + user_lookups) as float) / case user_updates when 0 then 1.0 else cast(user_updates as float) end) * 100 as [%] , (user_seeks + user_scans + user_lookups) AS total_usage , objectname=object_name(s.object_id), s.object_id , indexname=i.name, i.index_id , user_seeks, user_scans, user_lookups, user_updates , last_user_seek, last_user_scan, last_user_update , last_system_seek, last_system_scan, last_system_update , 'DROP INDEX ' + i.name + ' ON ' + object_name(s.object_id) as [Command], i.* from sys.dm_db_index_usage_stats s, sys.indexes i where database_id = @dbid and objectproperty(s.object_id,'IsUserTable') = 1 and i.object_id = s.object_id and i.index_id = s.index_id AND i.name IS NOT NULL AND i.is_primary_key = 0 --исключаем Primary Key AND i.is_unique_constraint = 0 --исключаем Constraints --and object_name(s.object_id) = 'MyBigTable' order by [%] asc<p>Я не рекомендую сразу идти и удалять индексы, которые не используются, но нужно обратить внимание на них и посмотреть кто, когда и зачем их создал.</p>
5 <p>Например, у меня в практике был<strong>индекс</strong>, по которому считался большой и важный отчёт. Он считался редко, 1 раз в месяц. Я, используя статистику, нашла этот огромный<strong>индекс</strong>вообще без использования, всё проверила, убедилась, что никто его не использует, и удалила.</p>
5 <p>Например, у меня в практике был<strong>индекс</strong>, по которому считался большой и важный отчёт. Он считался редко, 1 раз в месяц. Я, используя статистику, нашла этот огромный<strong>индекс</strong>вообще без использования, всё проверила, убедилась, что никто его не использует, и удалила.</p>
6 <p>А потом, настало время расчёта того самого отчёта. И сразу стало понятно, чей был этот огромный индекс. Благо, это был отчётный сервер, на котором индекс можно было создать, не повлияв на клиентов, но просыпаться для этого ночью всё же пришлось.</p>
6 <p>А потом, настало время расчёта того самого отчёта. И сразу стало понятно, чей был этот огромный индекс. Благо, это был отчётный сервер, на котором индекс можно было создать, не повлияв на клиентов, но просыпаться для этого ночью всё же пришлось.</p>
7 <p><strong>Поэтому лучше перепроверьте несколько раз, что ваш индекс точно не используется.</strong>И перед удалением возьмите таймаут хотя бы на 2 недели, вдруг что-нибудь выявится.</p>
7 <p><strong>Поэтому лучше перепроверьте несколько раз, что ваш индекс точно не используется.</strong>И перед удалением возьмите таймаут хотя бы на 2 недели, вдруг что-нибудь выявится.</p>
8 <p><em>Появились вопросы? Пишите их в комментариях!</em></p>
8 <p><em>Появились вопросы? Пишите их в комментариях!</em></p>
9  
9