Alper ÇELİK

Bilgisayar Mühendisi

İndex Kavramı_5

Bir tablo veya view üzerinde tanımlı olan indeksleri görebilmek için :  
 
sp_helpindex 'tablo_adı' (burada şayet dbo'suz tablo adını yazarsanız çift tırnağa gerek yok ancak dbo adını belirtme gereği duyuyorsanız tırnak içine yazmalısınız.)
 
ya da
 
tablo veya view üzerindeki tanımlı sütunlar ile birlikte indeks verilerini de görmek için, sp_help sistem stored prosedürünü kullanmalısınız.
 
sp_help 'tablo_adı'
 
 Veritabanında bulunan tüm indeskler ile ilgili bilgiler, sys.indexes sistem kataloğunda tutulurlar. Bu tabloda her bir indeks için bir satır olmak üzere, bir tablo için en az bir satır yer alır. Çünkü bir tablo üstünde hiç indeks tanımlı değil ise en azından bir Heap tanımı olacaktır ve Heap tanımları da bu tabloda tutulur.
 
SELECT *
FROM sys.indexes  
 
------------------------------------------------------------------------
 
Indeksler üzerinde çeşitli amaçlarla değişiklik yapabilirsiniz. Bu değişikliklere göz atalım şimdi:
 
* 1) Rebuild(Yeniden Derlemek): Indeksin kapladığı alan ile ilgili revizyon yapmak maksadıyla kullanılabilir. Yeniden derlenecek indeksleri ilgilendiren seçenekler şunlardır:  
 
-FILLFACTOR
-PAD_INDEX
-SORT_IN_TEMPDB
-IGNORE_DUP_KEY
-STATISTICS_NORECOMPUTE
 
Not: Büyük bir indeksi yeniden derlerseniz (mesela 128 Extent= 65 MB) SQL Server motoru, önce verileri ayrı bir alana taşır, sıralar  ve daha sonra yeniden yerine yerleştirir. Bu nedenle bu tip işlemler için ek disk gereksinimi olabilir.
 
Bir clustered indeksi yeniden derlemek, kendisine bağlı tüm non-clustered indekslerin yeniden derlenmesi için yeterli değildir. Bu işlem için şu sentaks kullanılabilir:
 
ALTER INDEX ALL ON tablo_adı
REBUILD (secenekler)
 
* 2) Reorganize(Yeniden Düzenlemek): Indeks tanımında yer alan FILL FACTOR değerine eşit olarak sadece uç seviye Indeks sayfalarını yeniden yapılandırır. REORGANIZE ile aralarda boşalan indeks sayfalarının içeriği tam olarak boşaldı ise bu tür sayfaların atılmasını sağlar. Bunun dışında, indekse başlangıçta ayrılan sayfaları kullanmaya devam edecek işlemler yaptığından fazla kaynak tüketmez. Bu nedenle de tempdb'de ek yer gereksinimi yoktur. Verileri kendi yerlerinde işler.
 
* 3) Disable(Indeksleri Kapatmak): Geçici olarak Indeksin sorgu iyileştirmelerinde kullanılmamasını sağlamak gerektiğinde tercih edilir. Kapatılan indeks bir clustered indeks ise tablo offline geçmiş olur. Yani veri okumaya ve yazmaya karşı engellenmiş olur.
 
* 4) Set(Indeks Seçeneklerini Değiştirmek): Indeks seçeneklerine yeni değerler vermek için kullanılırlar. Bazı seçenekler ALTER INDEX ifadesi ile değiştirilemezler.  
 
------------------------------------------------------------------------
 
INDEKSLERE BAKIM YAPMAK:  
 
 
Indeksler verilerin eklenip silinmesi sonucunda zamanla etkilerinde bozulmalar meydana gelebilir. Bu sebepten indeksleri bu tür durumlar için kontrol altında tutup gerektiğinde yeniden düzenleme işlemlerine sokmak gerekir. Transaction yoğunluklu tablolar üzerinde tanımlı olan indeksler için, FILLFACTOR ve PAD_INDEX parametreleri ile sayfalarda boş yerler bırakmak akıllıca olacaktır. Böylece her veri eklendiğinde yeni sayfalamalar(paging) yapılmayacağı için performans artışı olacaktır.
Indekslerin dağınıklık durumlarını ortadan kaldırmaya yönelik iki yöntem vardır, bunlardan ilki REBUILD diğeri ise REORGANIZE. (Indeksi silip yeniden oluşturmak da bir çözümdür.)
Bu 2 yöntem de farklı durumlar için tercih edilmelidirler. Bozulmaların az olduğu durumlarda VTYS'yi fazla yormamak için REORGANIZE yöntemi kullanılabilir. REORGANIZE yöntemi ile bir indeksi ilk hali kadar düzenli bir seviyeye getiremesek de, uç seviye sayfaları tamamen düzenler ve ara seviye sayfalarda da boşalmış sayfaların çıkartılması gibi küçük ayarlamaları yapabilir. REBUILD seçeneğine göre daha az hafıza, disk ve işlemci maliyeti getirir. Ayrıca aynı tablo üstünde LOB alanlar varsa, bu sütunların kullandığı gereksiz sayfalar da bu yolla atılabilir. Ancak bir indeks çok fazla dağılmışsa, tek seçenek olarak yeniden derlemeyi(REBUILD) düşünmek gerekir. REBUILD işlemi, indeksi silip yeniden oluşturur. Bu nedenle, bir indeksi REBUILD ederken bir çok özelliğini değiştirebilirsiniz.  
 
 
INDEKSLERİ DÜZENLEMEK:  
Zamanla oluşacak düzensizliklerin önüne geçmek için indeksleri yeniden düzenleme (defragmantasyon) yapmak gerekebilir. Bunun için takip edilebilecek 2 yöntem vardır. Indeksler çeşitli yöntemlerle yeniden oluşturulabilir veya yeniden düzenlenebilir (defragmantasyon). Az yıpranmış indeskler için, yeniden düzenlemek yeterli olabilir. Yeniden düzenlemek için daha az kaynak tüketmek üzere ALTER INDEX...REORGANIZE ifadesini tercih edebiliriz. Ancak sisteminiz yeterince büyük değil ise veya bozulmalar çok fazla ise, indeksi yeniden derlemeyi(REBUILD) tercih etmeniz yararınıza olacaktır.
 
Not: Bir tablo üstünde bütün indeksler ya Heap'e veya Clustered Index'e bağlıdır. O halde Clustered Indeks'i silip yeniden oluşturursak, diğer bütün indeksler de Sql Server tarafından otomatik olarak yeniden oluşturulur.  
 
INDEKSLERİN İSTATİSTİĞİ:  
 
Sql Server tarafından, her bir indekse dair istatistikler tutulur. Bu istatistikler, indeksin ne kadar kullanışlı olabileceğine dair bilgiler oluşturulurken kullanılır ve Sql Server Query Optimizer denilen sunucu uygulama tarafından sorgu planı oluşturma aşamasında kullanılır.
Sql Server'ın bir indeks hakkında veya bizim oluşturduğumuz bir istatistik hakkında bilgilere göz atmamız mümkündür. Bunu, genellikle bir tablo üstünde çok fazla veri değişikliği yaptıktan sonra, indekslere yansıyıp yansımadığını görmek için kullanabiliriz.
İki temel yöntem vardır: Sadece istatistiklerin ne zaman oluşturulduğunu görebiliriz veya istatistiklerin içerikleri hakkında bilgiler de alabiliriz.
Bir istatistik hakkında tarih bilgisini öğrenmek için şu genel ifade kullanılır:  
STATS_DATE(tablo_id, indeks_id)
Bir indeks hakkında tarihin yanı sıra bazı diğer bilgileri de görmek için DBCC SHOW_STATISTICS ifadesi kullanılır. Genel ifade şu şekildedir:  
DBCC SHOW_STATISTICS(tablo_ismi, indeks_ismi)
 
Sql Server, indekslere dair istatistikleri otomatik olarak oluştururken, Composite indekslerin sadece ilk sütunları hakkında istatistikler tutar ve kullanır. Gerek görüldüğünde kullanıcı tarafından composite indeks'in diğer sütunları ile birlikte, indekslerde yer almayan bir sütun hakkında bile istatistikler tanımlanabilir. Genel ifade şu şekildedir:  
CREATE STATISTICS istatistik_ismi
ON tablo&view adı (sütun adı)  
 
İstatistikler birer nesne gibi yönetilebilir. Delete, update, create işlemlerine tâbi tutulabilirler. Bir istatistiği silmek için şu ifadeden yararlanabiliriz.
 
DELETE STATISTICS istatistik_adı   
 
Böylece index konusu ile başlatmış olduğum serinin sonuna gelmiş bulunuyoruz. Takip eden yazılarımda görüşmek üzere.
 
 
 
 
 

Trigger Serisinin İlk Bölümüne Buradan Ulaşabilirsin

Trigger'lar özelleşmiş bir tür stored prosedürlerdir(SP).