Kullanılmayan / yalnız yazılan index'leri bul
SQL ServerBakımKomut
USE [Musteri];
SELECT OBJECT_SCHEMA_NAME(i.object_id) AS schema_name,
OBJECT_NAME(i.object_id) AS table_name,
i.name AS index_name,
ISNULL(us.user_seeks, 0) + ISNULL(us.user_scans, 0) + ISNULL(us.user_lookups, 0) AS reads,
ISNULL(us.user_updates, 0) AS writes,
ps.used_mb,
us.last_user_seek, us.last_user_scan,
N'DROP INDEX ' + QUOTENAME(i.name) + N' ON ' + QUOTENAME(OBJECT_SCHEMA_NAME(i.object_id))
+ N'.' + QUOTENAME(OBJECT_NAME(i.object_id)) + N';' AS drop_stmt_draft
FROM sys.indexes i
LEFT JOIN sys.dm_db_index_usage_stats us
ON us.database_id = DB_ID() AND us.object_id = i.object_id AND us.index_id = i.index_id
CROSS APPLY (SELECT CAST(SUM(p.used_page_count) * 8 / 1024.0 AS DECIMAL(18,1)) AS used_mb
FROM sys.dm_db_partition_stats p
WHERE p.object_id = i.object_id AND p.index_id = i.index_id) ps
WHERE OBJECTPROPERTY(i.object_id, 'IsUserTable') = 1
AND i.type_desc = N'NONCLUSTERED'
AND i.is_primary_key = 0 AND i.is_unique_constraint = 0 AND i.is_unique = 0
AND ISNULL(us.user_seeks, 0) + ISNULL(us.user_scans, 0) + ISNULL(us.user_lookups, 0) = 0
ORDER BY writes DESC, ps.used_mb DESC;
-- Kullanim sayaclari bu zamandan beri:
SELECT sqlserver_start_time FROM sys.dm_os_sys_info;Ne yapar?
Restart'tan bu yana hiç okunmamış (seek/scan/lookup = 0) ama yazma maliyeti üreten nonclustered index'leri boyutlarıyla listeler ve taslak DROP INDEX ifadesi üretir.
Ne zaman kullanılır?
Yazma yoğun tablolarda INSERT/UPDATE yavaşlığında, depolama ve bakım (rebuild, CHECKDB) süresini azaltmak için, index konsolidasyonu öncesi.
Dikkat
Sayaçlar restart'ta, DB offline/detach'ta ve bazı eski build'lerde (2012/2014) index rebuild'de sıfırlanır; ay sonu/yıl sonu raporlarının kullandığı index'ler kısa gözlemde "kullanılmıyor" görünür. Silmeden önce en az bir tam iş döngüsü boyunca gözle ve AG'de readable secondary'lerdeki kullanımı ayrıca kontrol et (sayaçlar replika bazındadır). Unique index'ler okunmasa da constraint sağlar; listeden çıkarıldı. Sadece sorgu; risksiz.