DBAtlas · Veritabanı operasyon atlası

Kullanılmayan / yalnız yazılan index'leri bul

SQL ServerBakım

Komut

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.

DBAtlas'ta aç →

İlgili