MSSQL Server Disable Edilen Indexleri Bulma

Bu makalede sql server veritabanından disable edilmiş indexleri bulma komutunu görmüş olacağız.

SSMS arayüzünde  index üzerine sağ tıklayıp indexs’i disable edebiliriz. Disable edilen index clustered veya nonclustered olsun tekrar aktif edilmek istendiğinde Rebuild işlemi yapılması gerekmektedir.

Gelen ekranda   index tanımının metadata’da tutulacağını ve yukarda belirttiğimiz sonuçları ifade ediyor. Ok diyerek disable edebilirsiniz. İlgili işlemin scripti alınabilir.

ALTER INDEX IX_TableName_IndexName ON TableName Disable 

Primary index disable edildikten sonra select çekildiğinde aşağıdaki hata alınmaktadır. Tablo tamamen ulaşılmaz olmaktadır. Eğer  primary indexs’i disable edersen hata alıyorsak pirmary key üzerinde constrant yapılarının silinmesi gerekmektedir. Constraint yapısının silinmesi şart değil ilgili index’inde silinmesi gerekmektedir. Bununla ilgili makaleye sayfadan ulaşabilirsiniz.

Msg 8655, Level 16, State 1, Line 2
The query processor is unable to produce a plan because the index ‘PK_Location_LocationID’ on table or view ‘Location’ is disabled.

Aşağıdaki komut ilgili veritabanı altında bulunan disable edilmiş indexs’leri bulmaktadır.

select
    sys.objects.name as table_name,
    sys.indexes.name as index_name
from sys.indexes
    inner join sys.objects on sys.objects.object_id = sys.indexes.object_id
where sys.indexes.is_disabled = 1
order by
    sys.objects.name,
    sys.indexes.name

‘is_disabled’ kolonu, indeksin devre dışı olup olmadığını belirtir (1 = Devre dışı, 0 = Etkin).

Tüm instance altında bulunan veritabanlarında hangi tabloda hangi indexsin disable edildiğini aşağıdaki komutla görebiliriz.

EXEC sp_MSforeachdb 
N'SELECT 
    ''?'' AS database_name,  
    o.name AS table_name,
    i.name AS index_name
FROM [?].sys.indexes i
INNER JOIN [?].sys.objects o ON o.object_id = i.object_id
WHERE i.is_disabled = 1
ORDER BY o.name, i.name;'

Tüm instance altında bulunan sadece disable edilmiş clustered indexlerin boyutunu gösteren script:

EXEC sp_MSforeachdb 
N'
IF EXISTS (SELECT 1 FROM [?].sys.databases WHERE name NOT IN (''master'', ''tempdb'', ''model'', ''msdb''))
BEGIN
    SELECT 
        ''?'' AS database_name,  
        o.name AS table_name,
        i.name AS index_name,
        i.type_desc AS index_type,
        p.rows AS row_count,
        SUM(a.total_pages) * 8 / 1024.0 AS index_size_MB
    FROM [?].sys.indexes i
    INNER JOIN [?].sys.objects o ON o.object_id = i.object_id
    INNER JOIN [?].sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id
    INNER JOIN [?].sys.allocation_units a ON p.partition_id = a.container_id
    WHERE i.is_disabled = 1 AND o.type = ''U''
    GROUP BY o.name, i.name, i.type_desc, p.rows
    ORDER BY o.name, i.name
END
';

Non clustered indexsler disable edildikten sonra silinmektedir.

Aşağıdaki komut yardımıyla disable edilmiş indexslerin boyutunu veritabanı bazında bulabiliriz. Tüm instance bazında çalıştırılması istenirse EXEC sp_MSforeachdb '' komutunun kullanılması gerekmektedir.

SELECT  
    t.name AS table_name,
    i.name AS index_name,
    i.type_desc AS index_type,
    p.rows AS row_count,
    SUM(a.total_pages) * 8 / 1024.0 AS index_size_MB
FROM 
    sys.indexes i
INNER JOIN 
    sys.objects t ON t.object_id = i.object_id AND t.type = 'U'
INNER JOIN 
    sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id
INNER JOIN 
    sys.allocation_units a ON p.partition_id = a.container_id
WHERE 
    i.is_disabled = 1
GROUP BY 
    t.name, i.name, i.type_desc, p.rows
ORDER BY 
    index_size_MB DESC;

Not: Non-clustered indexsler disable edilse diskten silinmektedir. Bu yüzden yukarıdaki komut herhangi bir non-clustered index üzerinde çalıştırılırsa veriler diskten silindiği için sonuç boş dönmektedir.

Not: Gerçek sistem üzerinde bir index silinirken hata mesajıyla karşılaşabiliriz. İlgili index’i silmek için ilk olarak ilk olarak index yapısının disable edilmesi gerekmektedir.

Not: Disable edilen bir index bakım çalışmasına katılmaz.

Bu makalede bir tablo altında bulunan indexslerin disable edilip edilmediğini görmüş olduk. Başka bir makalede görüşmek dileğiyle..

“Gurura kapılarak insanlara burun kıvırma, ortalıkta çalım satarak yürüme; unutma ki Allah gurura kapılıp kendini beğenen hiç kimseyi sevmez.”Lokman-18

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir