MS-SQL

SQL Server – Filtrelenmiş İndeksler

Sql Server 2008 versiyonu ile birlikte gelen ve indeks yapıları üzerinde bir genişletme olan filtrelenmiş indeksler, (filtred index) büyük verilerin sorgulanması için kolay uygulanabilir bir yol sağlar.

Büyük tabloların yönetiminde bölümleme (partitioning) bilinen bir yoldu ve Sql 2005 ile birlikte sunulmuştu. Filtrelenmiş indeksler ise tablo bölümleme kullanımından daha pratik bir şekilde uygulanabilen bir özellik olarak uzun süren sorunlarınıza hızlıca çözüm getirebilir. Filtrelenmiş indeksleri tablo bölümleme yerine kullanabilirsiniz demek istemiyorum. Ancak filtrelenmiş indeks size gerekli sonucu sağlıyorsa bölümlenmiş bir tablonun yönetim maliyetine girmenize gerek kalmayacaktır.

Filtrelenmiş indeks, indeks tanımında, sorgularınız içindeki “where” kısmında belirteceğiniz koşulun belirtilmesi ile oluşturulur. Yani oluşturduğunuz sorgunun filtresi, tablo üzerindeki indeksin filtresini içeriyorsa filtrelenmiş indeks kullanılır. İndeks içindeki veri filtre koşuluna göre düzenlendiğinden veriye daha hızlı ulaşılmış olur. Aşağıdaki örnek daha açıklayıcı olacaktır.

CREATE NONCLUSTERED INDEX [idx_tb_Satis2010] ON [dbo].[tb_Satis]
(
[Yil] ASC,
[Hafta] ASC,
[DepoID] ASC,
[UrunID] ASC
)
WHERE ([Yil]=(2010) AND [Miktar]<>(0))

Yukarıdaki indeks “2010” yılı için Miktar değeri “0” olmayan verileri indeksler ve siz sorgularınızda “…where Yil=2010 and Miktar<>0” şekilinde bir ifade kullanırsanız “query optimizer” tarafından yukarıda oluşturduğumuz indeks kullanılır.

“Execution plan” incelenerek indeksinizin kullanılıp kullanılmadığını görebilirisniz. Eğer indeks kullanılmıyorsa (sql server kullanmayı tercih etmiyor olabilir) ancak sorgunuz indeksi kullanarak daha hızlı çalışıyorsa “index hint“ yardımı ile sorgunuzun indeksi kullanmasını sağlayabilirsiniz.

Son olarak yaptığım bir testten bahsedip konuyu kapatacağım. Yaklaşık 821.000.000 kayıt olan bir tabloda aşağıdaki sorguları çalıştırdım.

select COUNT(0) from tb_Satis where Yil=2010 and DepoID=62

select COUNT(0) from tb_Satis where Yil=2010 and Miktar<>0 and DepoID=62

İlk sorgu filtrelenmiş indeksi kullanmadı. Çünkü koşul ifadesinde “Miktar<>0” şartı yoktu. Bu sorgu 2 dakika 10 saniye gibi bir sürede sonuç verdi. İkinci sorgu 16 saniye gibi bir sürede cevap verdi. Doğal olarak değerler sistemden sisteme, kullanımdan kullanıma değişecektir.  Ancak arada kayda değer fark olduğu bellidir.

Sonuç olarak ilgilendiğiniz verinin değerleri sabit ise (yukarıdaki örnekte Yil ve Miktar değerleridir) bunu indeks içinde belirterek daha verimli bir indeks oluşturabilirsiniz. Bunun için filtrelenmiş indeks kullanabilirsiniz.

Bir cevap yazın

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