Index’lerin Aktif/Pasif (Enabled/Disable) Yapılması

SQL Server 2000’de mevcut bir indexi aktif veya pasif yapamıyoruz. Sadece drop edebiliriz. Oysa bazı durumlarda örneğin optimizasyon işlemlerinde veya büyük aktarımlar için (DTS, BCP, BULK INSERT ) kısıtlı zamanlarda geçici olarak bazı indexleri pasif yapma ihtiyacı doğabiliyor. SQL Server 2005 ve sonrasında gelen ALTER INDEX komutu sayesinde bu işlem yapılabilmektedir.
Aşağıdaki komutları kullanarak örnek MUSTERI tablosunu oluşturalım.

--Tabloyu oluşturalım
CREATE TABLE MUSTERI(MusteriId int,AdSoyad varchar(50),KayitTarih smalldatetime)
GO
--Tablo üzerinde index oluşturalım
CREATE UNIQUE CLUSTERED INDEX IX_MusteriId ON MUSTERI(MusteriId)
GO
CREATE INDEX IX_AdSoyad ON MUSTERI(AdSoyad)
GO
CREATE INDEX IX_KayitTarih ON MUSTERI(KayitTarih)
GO
--Tabloya örnek kayıt girelim
INSERT INTO MUSTERI VALUES(1,'Ahmet Kaymaz',GETDATE())
INSERT INTO MUSTERI VALUES(2,'Ömer Kaymaz',GETDATE())
INSERT INTO MUSTERI VALUES(3,'Zeynep Kaymaz',GETDATE())

Bir non-clustered index’i disable ettiğimiz zaman sorguları en az maliyetle çalışmasından görevli SQL Server Optimizer aracı bu index’leri yoksayar. Ayrıca index datası fiziksel olarak silinir. Aşağıdaki sorguyu çalıştırıp Execution Plan’ına bakalım.

SET SHOWPLAN_TEXT ON
SELECT MusteriId,AdSoyad FROM MUSTERI WHERE AdSoyad ='Ahmet Kaymaz'

|-Index Seek(OBJECT:([Deneme].[dbo].[MUSTERI].[IX_AdSoyad]), SEEK:([Deneme].[dbo].[MUSTERI].[AdSoyad]=[@1]) ORDERED FORWARD)
“SET SHOWPLAN_TEXT ON” komutu yürütme planını metinsel olarak görmemizi sağlar. Grafiksel olarak bu planı görmek için “Include Actual Execution Plan” düğmesini tıklamamıza yeterli olacaktır.

Yürütme planı bu sorgu için MUSTERI tablosu üzerinde IX_AdSoyad indeksinin kullanılarak index seek operasyonun yapıldığını anlatmaktadır. Şimdi bu indexi DISABLE edelim.

ALTER INDEX IX_AdSoyad ON MUSTERI DISABLE

Disable işlemi ALTER INDEX komutuyla yapılabildiği gibi aşağıdaki gibi Management Studio üzerinden de yapılabilir.

Bu işlemden sonra aynı sorguyu çalıştırdığımızda bu sefer Execution Plan olarak aşağıdaki gibi bir sonuç dönecektir.
|-Clustered Index Scan(OBJECT:([Deneme].[dbo].[MUSTERI].[IX_MusteriId]), WHERE:([Deneme].[dbo].[MUSTERI].[AdSoyad]=[@1]))
Görüldüğü gibi Optimize IX_AdSoyad indexini görmezden gelip doğrudan clustered index scan operasyonunu uyguladı.
Non-clustered index’in disable edilmesinden sonra bu index için oluşturulmuş olan index datalarının silindiğini yazmıştık. Bunu doğrulamak için sys.sysindexes view’i çalıştırılabilir. Index’i disable yapmadan önce aşağıdaki sorguyu çalıştıracak olursak sonuç olarak “3¨ değeri dönecektir.

SELECT rowcnt FROM sys.sysindexes WHERE name = 'IX_AdSoyad'

Disable işleminden sonra rowcnt değeri “0¨ olarak dönecektir. Çünkü index page’ler silinmiş oldu. Ayrıca indexin aktif/pasif bilgisi de aynı view’deki is_disabled kolonunda belirtilmektedir.
Clustered Index’e gelince durum biraz daha farklılık arzetmektedir. SQL Server sisteminde non-clustered indexler varsa clustered index üzerine kurulduğu için clustered index tarafındaki düzenleme non-clustered indexleri etkilemektedir. Dolayısıyla clustered index’in disable edilmesi tüm non-clustered indexlerin disable olmasına neden olur. Ve daha öncemli clustered index tablonun kendisini ifade ettiği için bu disable işleminden sonra sistem kataloğunda indexle ilgili bilgi tutulsa da kullanıcı ilgili tabloya erişemez.

ALTER INDEX IX_MusteriId ON MUSTERI DISABLE

Bu işlem sonrasında SQL Server aşağıdaki gibi uyarıyı verecektir.

Warning: Index ‘IX_AdSoyad’ on table ‘MUSTERI’ was disabled as a result of disabling the clustered index on the table.
Warning: Index ‘IX_KayitTarih’ on table ‘MUSTERI’ was disabled as a result of disabling the clustered index on the table.

Şimdi örnek sorgumuzu çalıştıracak olursak aşağıdaki hatayla karşılaşırız.
The query processor is unable to produce a plan because the index ‘IX_MusteriId’ on table or view ‘MUSTERI’ is disabled.
Herhangi bir indexi yeniden aktifleştirmek için ALTER INDEX REBUILD veya CREATE INDEX WITH DROP_EXISTING komutları kullanılır. Yani indexler yeniden oluşturulur. Tüm indexleri rebuild etmek için ALTER INDEX ALL komutu kullanılır. Ayrıca clustered index’in aktifleştirilmesi tablo üzerindeki non-clustered indexlerin de aktifleştirileceği anlamına gelmez. Bu yüzden hepsinin bağımsız olarak rebuild edilmesi gerekmektedir. Tüm indexleri yeniden aktifleştirelim.

ALTER INDEX ALL ON MUSTERI REBUILD

Index’lerin drop edilmeden doğrudan pasif yapılması bulk import/update işlemleri için kolaylık sağlamaktadır.

Index’lerin Aktif/Pasif (Enabled/Disable) Yapılması” üzerine bir düşünce

  1. Selçuk

    çok anlamsız zaten her halükarda index rebuil ediliyor zaten.
    ne anlamı var ki disable etmenin?

    bana şunu deyin:

    1- drop index -> bulk import/update işlemleri -> create index

    2- disable index -> bulk import/update işlemleri -> rebuild index

    2 nin üstünlüğü nedir?

    Cevapla

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload CAPTCHA.