Index’i Disable Etmek
SQL Server 2005 ile index’ler artık disable edilebiliyor. Index disable edilirse tekrar enable etmek için index’i rebuild etmek gerekiyor. Clustered Index’i disable ederseniz, clustered index’in olduğu tablo erişilemez olacaktır. Tabloya erişimi istemediğiniz durumlarda tablo üzerindeki yetkileri kaldırmak karmaşık bir işlemse uygulayabilirsiniz.
Disable etmek istediğiniz index üzerinde sağ tıklayarak disable dediğinizde karşınıza aşağıdaki gibi bir ekran gelecektir. Bu ekranda index tanımının metadata’da tutulacağını ve yukarda belirttiğimiz sonuçları ifade ediyor. Ok diyerek disable edebilirsiniz.
Clustered Index’i disable ettikten sonra tabloya select çekmek istediğinizde aşağıdaki gibi bir hata alırsınız.
Msg 8655, Level 16, State 1, Line 2
The query processor is unable to produce a plan because the index ‘IX_Clustered’ on table or view ‘FamousFood ‘ is disabled.
Disable edilmiş bir index’i tekrar enable etmek için ALTER INDEX REBUILD ya da CREATE INDEX WITH DROP_EXISTING komutlarını kullanmanız gerekiyor. Index Rebuild işlemi için
ALTER INDEX [IX_Clustered] ON [dbo].[FamousFood ] REBUILD
CREATE UNIQUE CLUSTERED INDEX [IX_Clustered] ON [dbo].[FamousFood ] ( [ID] ASC )WITH (DROP_EXISTING = ON)
Bir ya da birden fazla index upgrade sırasında otomatik olarak disable edilebilir. Bu yüzden upgrade sırasında buna dikkat etmek gerekir.
Microsoft, buna sebep olarak’ta sistem fonksiyonlarını kullanan bir index upgrade sonrası değişik bir sonuç getirebilir, ya da upgrade’in bir parçası olarak collation değişikliği sonucu index yanlış sıralanabilir, bu yüzden upgrade sırasında bu tip index’ler disable hale getirilir diyor.
Upgrade sırasında bir index disable edilirse, index ismi ve ilgili constraint ismi uyarı mesajı olarak gösterilir. Böylece upgrade sonrası bu index’leri rebuild ederek tekrar aktif hale getirebilirsiniz.
Index’i disable etmeden rebuild ederseniz ve DROP_EXISTING=ON demezseniz, index rebuild işlemi sırasında hem eski hem de yeni index için ekstra alana ihtiyaç duyulur. Ama index’i disable ettikten sonra başka bir transaction’da rebuild işlemi gerçekleştirirseniz sıralama işlemi için yaklaşık %20’lik bir geçici disk alanının dışında ekstra bir disk alanı gerekmez.
Kullanılmayan index’leri silmeden önce bir süre kalması için disable edebilirsiniz. Kullanılmayan index’leri tespit etmek için “Kullanılmayan Index’leri Tespit Etmek” isimli makaleye göz atmak isteyebilirsiniz.
Disable edilmiş index’leri bulmak için aşağıdaki script’i kullanabilirsiniz.
SELECT o.name,i.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