Bu makalede Mssql server üzerinde veritabanını Enable-Disable-Drop komutlarını görmüş olacağız. Index’ler performansa her zaman olumlu katkı sağlamaz ve olumsuz yönde de etkileyebilir. Index’lerin kullanılmadığını fark ettiğimizde performansı olumsuz etkilememesi için ya silmemiz ya da pasif yapmamız gerekebilir.
Mevcut bir index‘i disable yapmak için aşağıdaki komut kullanılır.
ALTER INDEX IX_TableName_IndexName ON TableName Disable
İndex tanımlama bilgisini sistem kataloglarından silmez ama index’in içerdiği asıl veriyi siler. Non-clustered index’in pasif yapılması sadece index’e ulaşımı engeller herhangi bir sıkıntıya sebebiyet vermez yeniden oluşturulması veya Rebuild edilmesi gerekmektedir. Aşağıdaki resim Disable edilmiş Non Clustered indexse ait bir görüntü:

Clustered indexlerin disable yapılması ise drop veya rebuild etmedikçe tablonun verisine ulaşımı engeller. Çünkü clustered indexsler gerçek tablo üzerinde tutulmaktadır. Index’i kısa süre için silip tekrar oluşturmamız gerekiyorsa bu seçeneği kullanabiliriz.
Sql server yapımızda disable edilen indexleri tekrar enable edilmek istenebilir. Neden bir index disable edilir. SQL Server’da belirli bir tablo veya view’e bağlı olan bir indeksin artık sorgular tarafından kullanılmamasını sağlanır. Ancak bu işlem bazı önemli sonuçlar doğurur.
İndeks devre dışı bırakıldığında, sorgu optimizasyon motoru (Query Optimizer) bu indeksi artık sorgular için kullanamaz. Bu, sorgu performansının düşmesine neden olabilir, çünkü sistem artık tablodaki verileri taramak (table scan) zorunda kalabilir.
Clustered Index devre dışı bırakıldığında, bu indeksin fiziksel yapısı (veri sayfası düzeni) yerinde kalır ancak erişilemez hale gelir.

Non-clustered index devre dışı bırakıldığında, yalnızca indeks yapısı devre dışı kalır, fiziksel veriye etkisi olmaz. Aşağıdaki resimde non clustered indexs disable edildi. İlgili tablomuza select çektiğimizde sorgu sonucumuzun döndüğü görülmektedir.

Sadece nonclustered indexlerin disable edildiğinde hata vermesi için ilgili index yapısının sorguda çağrılması gerekmektedir. Yoksa yukarıdaki resimdeki gibi indexlerin disable edilmesinin bir sakıncası yoktur.


Devre dışı bırakılmış bir indeksin bulunduğu bir tabloya veri ekleme, güncelleme ve silme işlemleri sırasında indeks güncellenmez.
Bu durum genellikle yazma performansını artırabilir, ancak indeks yeniden etkinleştirilirken güncel olmayan verilerin yeniden oluşturulması gerekir.
Devre dışı bırakma işlemi, genellikle indekslerde bakım yapmak, onları yeniden oluşturmak veya geçici olarak devre dışı bırakmak için kullanılır.
Eğer disable bırakılmak istenen indexs bir Primary Key Constraint tarafından kullanılıyorsa, bu işlem başarısız olur. Önce ilgili kısıt kaldırılmalıdır.
Bir indeksi devre dışı bırakmak için aşağıdaki komutu kullanabilirsiniz:
ALTER INDEX IX_TableName_IndexName ON TableName Disable
Disable edilmiş bir indeksi tekrar aktif hale getirmek için yeniden oluşturmanız (rebuild) gerekir. Yeniden oluşturma, indeksin orijinal yapısını geri getirir ve devre dışı bırakıldığı süreçte yapılan tüm veri değişikliklerini yansıtır.
Not: Disable edilmiş indexsin silinmesi depolama alanımızda gereksiz alan kaplamasının önüne geçmiş oluruz. Clustered index devre dışı bırakıldığında, veri hâlâ diskte durur çünkü clustered index veri tablosunun kendisidir. Non-clustered index devre dışı bırakıldığında ise indeks yapısı kaldırılır ve diskte yer kaplamaz
ALTER INDEX IX_TableName_IndexName ON TableName Rebuild
Disable’ın Avantajları:
– Büyük veri taşıma işlemleri sırasında indeksleri geçici olarak devre dışı bırakmak, veri ekleme veya taşıma işlemlerini hızlandırabilir.
– İndeks bakımında (örneğin, fragmentasyon temizliği) kullanışlıdır.
Rebuild’in Dezavantajları:
– İndeksi etkinleştirmek için yeniden oluşturma işlemi zaman alabilir ve bu işlem sırasında ek disk alanı gerektirebilir.
– Büyük tablolar için, rebuild işlemi I/O ve CPU kaynaklarını tüketir.
Disable edilen indeksleri tekrar etkinleştirmek için `ALTER INDEX … REBUILD` kullanılır. Genel komut:
USE [AdventureWorks2014]
GO
ALTER INDEX [IX_Address_AddressLine1_AddressLine2_City_StateProvinceID_PostalCode] ON [Person].[Address] REBUILD PARTITION = ALL
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON)
GO
PARTITION = ALL ifadesi eğer tablomuz partition yapıda ise tablonun partition bakımından index bakımını yapmaktadır. Yukarıdaki ifadede tablomuz partition yapısında değil bu ifadenin kullanılması gereksizdir. Kullanılmasında herhangi bir sakınca yoktur.
Şimdi disable edilmiş clustered index yapımızı tekrardan aktif edelim. Bu işlem ssms arayüzünden yapıldığı gibi script’lede yapılmaktadır. Dikkat ederseniz sadece rebuild ikonunun aktif olduğu görülmektedir.

Rebuild dedikten sonra scriptini aldığımızda aşağıdaki gibi kod bloğunu alıyoruz. Gereksiz olan diğer işlemleri siliyorum
USE [AdventureWorks2014]
GO
ALTER INDEX [PK_ProductCategory_ProductCategoryID] ON [Production].[ProductCategory] REBUILD
Zaten tablomuz ulaşılamaz olduğu için primary key olan kolonu mevcut index yapımız var olsa bile drop existing komutuyla tekrar oluşturuyorum.
CREATE UNIQUE CLUSTERED INDEX [PK_ProductCategory_ProductCategoryID] ON [Production].[ProductCategory]
(
ProductCategoryID ASC
)WITH (DROP_EXISTING = ON)
Aşağıdaki bilgi veritabani.gen.tr’den alınmıştır.
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.
Mevcut olan Index yapısını silmek için aşağıdaki komut kullanılır. Indexlerin silinmesi; clustered index’ler silindiğinde leaf node’larda tutulan veri, sıralanmamış heap table’larda tutulmaya başlanır. Hem tanımla bilgisi hem de index’in verileri diskten silinir. Primary key olarak tanımlanan clustered index silinemez. İlk önce tablodaki bu constraint kaldırılmalıdır. Kaldırıldıktan sonra silme işlemi rahatlıkla yapılabilir.
DROP INDEX IX_TableName_IndexName ON TableName
Bu makalede indexslerin nasıl disable ve enable edildiğini aynı zamanda nasıl silindiğini görmüş olduk. Başka bir makalede görüşmek dileğiyle..
Kim bir iyilikle gelirse, kendisine bunun on katı vardır, kim bir kötülükle gelirse, onun mislinden başkasıyla cezalandırılmaz ve onlar haksızlığa uğratılmazlar. En’am Suresi, 160. Ayet