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.




Recent Comments