SQL Server - Indexes
İndeks Yapısı İndeksler, tablolardan veri çekmek için gerekli sorgular çalışırken geçecek olan süreyi azaltmak için kullanılan yapılardır. Verilerin düzensiz bir şekilde dizilmesine «heap / yığın» adı verilir. Kayıtların giriliş sırasına göre dizilmesi de bu şekildedir. Heap şeklindeki bir tabloda belirli bir kayıtı bulmak için bütün kayıtların tek tek kontrol edilmesi gerekir. Bu işlem «table scan / tablo taraması» olarak isimlendirilir. İçerisinde çok miktarda kayıt olan bir tabloda «Table scan» ile kayıt arama, indekse göre kayıt aramaya göre çok daha yavaş kalır. Kayıt sayısının az olduğu durumlarda ise table scan daha hızlı olabilir.
Verilerin belirli bir alana göre fiziksel olarak sıralanması işlemine «Clustered Index (CL)» isimi verilir. Her tablo için bir tane oluşturulabilir. (Örneğin: Bir kütüphanede kitapların raflara kitap isimlerine göre yerleştirilmesi) Non-Clustered (NC) Index’ler, bir clustered index veya Heap üstünden hızlı olarak kayıtlara erişim sağlamak için tanımlanırlar. (Örneğin:Yazar adına göre karşılık gelen kitabın bulunması/eşleştirilmesi gibi) Bir tabloda en fazla 249 tane Non-Clustered index olabilir. Bir çok tabloda NC indexler işlemleri hızlandırırken; küçük tablolarda table scan daha hızlı olabilir. Query optimizer aracılığı ile SQL Server buna kendi karar verir.
Bir sorgunun Execution Plan’ı sorgunun işleyiş aşamaları ile ilgili bilgi verir. (Ctrl+L) SQL Server ve diğer birçok VTYS, indexlerin gerçekleştirilmesinde Balanced Tree (B-tree veya β-tree) algoritmasını kullanır. Buna göre Btree’de yeralan sayfalar üç kategoride gösterilir. Kök seviye (Root): Bütün düğümlerin bağlı olduğu tek ve en tepedeki sayfa/düğüm Ara seviye (Intermediate) veya Yaprak olmayan (Non-Leaf): Kendine bağlı en az bir düğüm (sayfa) olan bağlı düğümler/sayfa Yaprak seviyesi (Leaf): Kendine hiç index sayfası bağlı olmayan düğümler/sayfa
B-tree yapısında, her bir düğümün mümkün olduğunca eşit sayıda alt düğümü olması istenir ve derinliğin mümkün olduğunca az olması için çalışılır. Herhangi bir kayıt eklendiğinde veya silindiğinde, ağaç yeniden dengelenir. Bu sebeple arka planda indexlerin yapısında dağınıklıklar ortaya çıkabilir. SQL Server performans araçları kullanılarak bunlar izlenebilir.
Yanda görülen örnekte 85 aranacak olursa: B-Tree yapılarında veri arama işlemi, veri ekleme ve silme işlemlerine göre daha hızlıdır. Herhangi bir veri aranırken Root leveldan aramaya başlanır. Ardından kollara ayrılarak Intermediate level üzerinde gezilir. (Aranan değer üzerinde bulunulan düğümün değerinden daha büyükse sağ tarafa, daha küçükse sol tarafa gidilir.) Arama işlemi leaf level seviyesinde devam ettirilir. Yanda görülen örnekte 85 aranacak olursa: Aranan değer kök değerden (50) daha büyük olduğu için sağ tarafa inilir. Aranan değer kök düğümün sağındaki değerlerle karşılaştırılır. 85 değeri sağ intermediate leveldeki ilk anahtar değer olan 65 ile karşılaştırılır. 85, 65’ten büyük olduğundan dolayı diğer anahtara (90) geçilir. 85, 90 değerinden küçük olduğundan dolayı 65-90 anahtarları arasında bulunan ok takip edilir. Öncelikle ilk anahtar değer olan 80 ile karşılaştırılır. 80 ile 85 eşleşmediğinden dalayı diğer değere geçilir. Ve leaf levelde eşleşme tamamlanır. Toplamda 3 tane mantıksal okuma ile istenilen veriye erişim sağlanmıştır. 50 45 40 47 80 85 65 90 60 93 95
Index Tanımlama Yaklaşımları Index tanımlarken en önemli nokta, çalışılan sistemin OLAP veya OLTP olduğudur. OLAP’lar okuma ağırlıklı sistemler olduğundan, index sayısının fazla olması işleri kolaylaştırır. OLTP’lerde daha çok Update, Insert, Delete işlemleri yoğun olduğu için index sayısının artması SQL Server’a yük getirir. Az olması tavsiye edilir. Ancak bir tablo için hiç index tanımlanmaması da tabloda fazlaca kayıt olduğu sürece performansı azaltır.
Index Kullanımının Performans İncelenmesi-1
Index Kullanımının Performans İncelenmesi-1 SET STATISTICS IO : Yazılan sorgunun disk üzerinde yaptığı işlemlerin IO istatistiklerinin incelenmesi için kullanılır SET STATISTICS TIME ON: Çalıştırılan sorgunun faaliyet süresini görüntüler. Aynı zamanda CPU ölçümü için de kullanılır.
Index Kullanımının Performans İncelenmesi-2
Index Kullanımının Performans İncelenmesi-2 SET STATISTICS IO : Yazılan sorgunun disk üzerinde yaptığı işlemlerin IO istatistiklerinin incelenmesi için kullanılır SET STATISTICS TIME ON: Çalıştırılan sorgunun faaliyet süresini görüntüler. Aynı zamanda CPU ölçümü için de kullanılır.
Index Kullanımının Performans Karşılaştırmaları-1
Index Kullanımının Performans Karşılaştırmaları-2
Index Tanımlama Yaklaşımları Clustered Index (CL) tanımlarken: Sık sorgulanan alanların Boyutu küçük alanların Daha az değişim olan alanların kullanılması tavsiye edilir. Identity tanımlı alanlarda (sıralı ve unique/benzersiz özellikli alanlar olmaları sebebiyle) index kullanımı performansı artıracaktır.
Index Oluşturma Örnekleri Code: CREATE CLUSTERED INDEX Index_Name_Clstd ON Students(Name); Output: The command(s) completed successfully. Explanation: In the above example, we have built a clustered index, Index_Name_Clstd, on the 'Name' column of the 'Students' table. Language(s): MS SQL Server CREATE NONCLUSTERED INDEX Index_Name_NonClstd ON Students(Name); In the above example, we have built a nonclustered index, Index_Name_NonClstd, on the 'Name' column of the 'Students' table. CREATE UNIQUE INDEX Index_Name_Unique ON Students (Name); The above example creates a unique index, Index_Name_Unique, on the 'Name' column of the 'Students' table.
CREATE INDEX NC_Ogrno ON Ogrenciler(OgrNo DESC) -- ASC veya DESC olabilir. Belirtilmezse ASC sayılır. CREATE INDEX NC_Satislar -- Birden fazla alan üzerinde çoklu index oluşturulabilir. ON Satislar (MusteriNo, Tarih) *İçeriye girilecek verilerin tekrar etmesi istenmiyorsa UNIQUE index tanımlanabilir. CL ve NCL olabilir. Primary Key veya Unique Constraint tanımlandığında, SQL Server bir unique index tanımlar. Böyle bir constraint tanımlanırken SQL Server’a CL veya NCL olup olmayacağı belirtilebilir. ALTER TABLE tblDoviz ADD CONSTRAINT PK_Doviz PRIMARY KEY(DovizKod) CLUSTERED DROP INDEX Ogrenciler1.IN_Ogrenciler1 (Tablo adını belirtmek gerekiyor)
Kaynaklar «Yazılımcılar İçin SQL Server 2012 & Veritabanı Programlama», Yaşar GÖZÜDELİ, Seçkin Yay. – 2012 «T-SQL SQL Server 2012», Hamza ELBAHADIR, KodLab Yay. - 2012