Неиспользуемые индексы

Проблема с индексами традиционна для DBA, ключевой вопрос производительности.

Неиспользуемые нужно удалять, миссинг индекс нужно создавать. Делать это следует разумно и рационально. Вот небольшой набор ссылок на эту тему

Ищем неиспользуемые индексы SQL Server

Поиск неиспользуемых индексов

Административные скрипты MS SQL- очень интересная подборка

 

Немного докрутил скрипт, получился такой себе справочник-генератор заготовок. Сверху собираются индексы, которые можно бы и задизаблить, в осадок выпадают нужные и полезные индексы. Их бы отребилдить при возможности

 

— Dmitry Gorchilin 20160801 Digger.dp.ua

SELECT
OBJECT_SCHEMA_NAME(i.object_id)AS [Schema Name],
OBJECT_NAME(i.object_id) AS [Table Name],
i.name AS [Index Name],
i.type_desc,
s.last_user_update AS [Last Update Time],
s.user_updates AS [Updates],
user_scans+user_seeks+user_lookups AS Activity,
reserved/128 AS ‘Mb’,
‘DBCC SHOWCONTIG (‘+char(39)+OBJECT_SCHEMA_NAME(i.object_id)+’.’+OBJECT_NAME(i.object_id)+char(39)+’,’+CONVERT(VARCHAR(20),i.index_id)+
case when i.type_desc=’HEAP’ then ‘)– HEAP ‘
else ‘)– ‘+i.name end
+’ –‘+convert(varchar(20),reserved/128 )+’Mb’,
‘SELECT * from sys.dm_db_index_physical_stats(‘+CONVERT(VARCHAR(20),db_id(db_name()))+’,’+ CONVERT(VARCHAR(20),i.object_id)+’,’+CONVERT(VARCHAR(20),i.index_id)+’, NULL , ‘+char(39)+’DETAILED’+char(39)+’)’+
‘– ‘+convert(varchar(20),reserved/128 )+’Mb ‘+
OBJECT_SCHEMA_NAME(i.object_id)+’.’+OBJECT_NAME(i.object_id)+
case when i.type_desc=’HEAP’ then ‘)– HEAP ‘
else ‘)– ‘+i.name end,
case when i.type_desc=’HEAP’ then ‘–HEAP’ else
‘DROP INDEX ‘+i.name+ ‘ ON ‘+OBJECT_SCHEMA_NAME(i.object_id)+’.’+OBJECT_NAME(i.object_id) END,
‘ALTER INDEX ‘+
case when i.type_desc=’HEAP’ then ‘HEAP’ else i.name end+
‘ ON [‘+OBJECT_SCHEMA_NAME(i.object_id)+’].[‘+OBJECT_NAME(i.object_id)+’] DISABLE/*REBUILD WITH (SORT_IN_TEMPDB = ON, maxdop=1)*/ –‘+convert(varchar(20),reserved/128 )+’Mb’
FROM sys.dm_db_index_usage_stats AS s
JOIN sys.indexes AS i
ON i.object_id = s.object_id
AND i.index_id = s.index_id
JOIN sys.objects AS o
ON o.object_id = s.object_id
join sys.sysindexes sy on i.object_id = sy.id and i.index_id=sy.indid
WHERE s.database_id = DB_ID()
/*AND ( user_scans = 0
AND user_seeks = 0
AND user_lookups = 0
AND last_user_scan IS NULL
AND last_user_seek IS NULL
AND last_user_lookup IS NULL
)*/
AND
OBJECTPROPERTY(i.[object_id], ‘IsSystemTable’ ) = 0
AND INDEXPROPERTY (i.[object_id], i.name, ‘IsAutoStatistics’) = 0
AND INDEXPROPERTY (i.[object_id], i.name, ‘IsHypothetical’ ) = 0
AND INDEXPROPERTY (i.[object_id], i.name, ‘IsStatistics’ ) = 0
AND INDEXPROPERTY (i.[object_id], i.name, ‘IsFulltextKey’ ) = 0
AND (i.index_id between 2 AND 250 OR (i.index_id=1 AND OBJECTPROPERTY(i.[object_id],’IsView’)=1))
AND o.type != ‘IT’
–AND i.name LIKE ‘%Gorchilin%’
–and OBJECT_SCHEMA_NAME(i.object_id) = ‘Price’
ORDER BY user_scans+user_seeks+user_lookups,– Activity
s.user_updates DESC,– [Updates],
reserved/128 DESC– ‘Mb’

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *