運用環境で使用されていないインデックスを削除するためにクエリを作成しましたが、last_user_update
列がインデックスが単にメンテナンスのオーバーヘッドであったことを示しているかどうかに興味があります。削除するのが良いか、またはインデックスが挿入/更新/削除ステートメントのパフォーマンスに役立つかどうか。その場合、削除したくありません。以下は、使用したいクエリです。
DECLARE @DBInfo TABLE
( database_id int, object_id int, tablename nvarchar(200), indexname nvarchar(200), lastactivity datetime)
DECLARE @command VARCHAR(5000)
SELECT @command = 'Use [' + '?' + '] SELECT
database_id, o.object_id, o.name, i.name as indexname, max(lastactivity) as lastactivity
from (
select database_id, object_id, index_id, max(last_user_seek) as lastactivity from sys.dm_db_index_usage_stats
WHERE object_id > 1000
GROUP BY database_id, object_id, index_id
UNION ALL
select database_id, object_id, index_id, max(last_user_scan) as lastactivity from sys.dm_db_index_usage_stats
WHERE object_id > 1000
GROUP BY database_id, object_id, index_id
UNION ALL
select database_id, object_id, index_id, max(last_user_lookup) as lastactivity from sys.dm_db_index_usage_stats
WHERE object_id > 1000
GROUP BY database_id, object_id, index_id
/*UNION ALL
select database_id, object_id, index_id, max(last_user_update) as lastactivity from sys.dm_db_index_usage_stats
WHERE object_id > 1000
GROUP BY database_id, object_id, index_id*/
) a
inner join sys.objects o on a.object_id = o.object_id
inner join sys.indexes i on i.object_id = a.object_id AND i.index_id = a.index_id
where database_id = db_id()
GROUP BY database_id, o.object_id, o.name, i.name
order by lastactivity'
INSERT INTO @DBInfo
(database_id, object_id, tablename, indexname, lastactivity)
EXEC sp_MSForEachDB @command
SELECT db_name(database_id) as dbname, tablename, indexname, lastactivity FROM @DBInfo
where lastactivity < dateadd(day, -15, getdate()) or lastactivity is null
order by db_name(database_id), tablename, indexname