Sql Server Index Yapısı
Index nedir? Peki, nasıl bir yapısı var, ne yarar sağlar, neden ve nasıl kullanılır gibi detayları bu yazıda sizler ile paylaşacağım. Bir DB üzerinde sorgularınız oldukça geç cevap veriyor ise bu yazı size yol gösterici olabilir. Açıkça söylemek gerekirse ben Index’lerin ne olduğunu büyük Database’lerle çalışmadan bilmiyordum. Ta ki bir gün bir projede Database deki birden fazla tablonun içerisindeki kayıtların yüzbinleri hatta milyonları bulabileceği söylenene kadar. İlk yaptığım hemen 3 kolonlu basit olarak adı ve soyadı bilgilerini tutan bir tablo oluşturmak oldu. Daha sonra basit bir while döngüsü ile 1.000.000 kayıt girdisi yaptım. Sonrasında ise sadece select * from adi where adi=’tekin99999′ şeklinde bir sorgu çekmek oldu. Bakın ne join yapısı var ne sub query filan var. Basit bir sorgu. Dedim en fazla 2-3 saniyede getirir sonucu dedim. Fakat hiç de öyle olmadı :).Oldukça fazla beklemiştim. Dedim bu böyle olmaz. Mutlaka bir yolu yöntemi vardır. Araştırmalarım sonucunda Index nimetini buldum. Index yapısını oluşturduktan sonraki sorgumun sonucu bana 1-2 saniye gibi müthiş bir hız farkıyla döndü. Bu bizzat benim yaşadığım örnekti. Bir de düşünün arkadaşlar Turkcell, Avea gibi telefon şirketlerinin Database’lerini ve bu Database’lere gelen sorguları? Yani kısacası eğer veriniz oldukça fazla ise yada en azından bunu öngörebiliyorsanız yüksek performans almak zorundasınız. Bunun için de Index yapısı oluşturmalısınız arkadaşlar. Index’in faydasını anlattıktan sonra hadi gelin Index in yapısını inceleyelim.
SQL Server’da 2 farklı Index yapısı mevcuttur. Clustered ve Non-Clustered Index.
1. Clustered Index: Kümelenmiş Index olarak Türkçe’ye çevrilebilir. Diyelim ki arkadaşlar özel bir dershane açtık. İlk gün 10 tane öğrenci geldi kayıt ettik. Bu öğrencilerin dosyalarını çekmeceye koyduk.2.gün 15 öğrenci kaydoldu ve bu öğrencilerin dosyalarını da çekmeceye koyduk. İlk hafta sonunda toplam 60 öğrencimiz oldu. Çekmecemiz doldu bu sefer de dolaplara koymaya başladık. Bu şekilde durumu kurtardığımızı düşündük. Fakat yıllar geçti bu sefer dolaplarda yetmedi hatta arşivlemeye başladık. Yer sıkıntımız oluştu. Hatta bir gün Koray Düzgün adında bir öğrencimizin bilgisine ulaşmak istedik. O kadar veri yığınının içinde ara ki bulasın. Bundan bir ders çıkardık ve alfabetik sıraya göre sıralayıp tüm dosyaları kümeleştirdik. Bir sonraki öğrenci geldiğinde direk hangi kümedeyse hangi sıradaysa gidip bulduk. Ne kadar hızlı sonuca ulaşıp ne kadar iş ve zaman kazancı sağladık. İşte arkadaşlar Database’imizdeki verilere Clustered Index yapısı oluşturursak aynı şekilde kazanç sağlarız. Clustered Index yapısında elimizdeki veriler sıralı olarak belli bir grup içinde bulunur. Bu şekilde çok daha hızlı bir şekilde sonuca ulaşırız. Aslında eğer veri tabanı oluşturduysanız daha önce farkında olmadan kesinlikle eminim ki Clustered Index kullandınız. Hepiniz bir tabloda bir kolona mutlaka Rrimary Key koymuşsunuzdur. Hatta identity bile verdiniz. Identity verdiğiniz anda o kolondaki veriler sıralı olarak kaydedilmiyor mu? Alın size işte Clustered Index. Clustered Index 3 yapıdan oluşur.
Clustered Index yapıldığında sıralanan veriler Leaf’de tutulur. Yukarıdaki örnekte öğrencinin dosyasına ulaştığınızda direk verinin kendisine ulaşıyoruz değil mi? Bunun nedeni de Clustered Index de veriler Leaf aşamasında bulunur. Baş harflerine göre gruplama yaptığımızda ise bu grup bilgileri de Intermadiate Level’larda tutulur. Bilinmesi gereken en önemli noktalardan birisi bir tabloda sadece 1 tane Clustered Index oluşturulabilir.
2. Non-Clustered Index: Bir kitap aldınız elinize. Oldukça kalın bir kitap. Diyelim ki SQL Server ile ilgili bir kitap olsun. Ve Index konusunun geçtiği sayfaları tek tek bulmak istiyorsunuz. Ne yaparsınız? Bütün kitabı arayıp bulur musunuz? Yok artık. Bazı kitaplarda sonlarında içinde geçen konular ve bu konuların ve ya kelimelerin sayfa numaraları liste halinde yazılıdır. Ne yaparsınız böyle bir durumda? Öncelikle gidip arkadan hangi sayfalarda olduğunu bulursunuz. Daha sonra o sayfalara bakıp veriye ulaşırsınız. İşte en güzel non-Clustered yapısı. Bu örnekten de anlaşıldığı gibi non-Clustered yapıda verinin kendisine ulaşamazsınız. Bu yapıda Leaf level’larda verinin bulunduğu adres bulunur. Daha sonra tekrardan Root’a çıkılıp aşağıya doğru inilerek verinin kendisine ulaşılır. SQL Server 2005 de 255 tane bir tabloya non-Clustered Index oluşturabiliyorduk. SQL Server 2008 ile birlikte 999 adet oluşturulabilinir. Fakat pek tabi bir tabloya bu kadar non-Clustered Index verilmez. Ben bolca var nasılsa her kolona koyayım oh ne güzel gibi bir düşünce olmasın. Çünkü bu sefer Index yapısı arka planda karışıyor. Dikkat edilmesi gereken şu ki en fazla sorgu çekilen kolonlara verilmek en doğrusudur.
Clustered yapılarını kavradıktan sonra bakalım tüm bu anlatılanlar ne kadar doğru? Hemen test yapalım arkadaşlar.
DECLARE @i INT
SET @i=0
WHILE(@i<100000)
BEGIN
INSERT INTO dbo.Telefonlar
SELECT Ad=’Koray’+CAST(@i AS nvarchar(30)),SoyAd=’Düzgün’+CAST(@i ASNVARCHAR(30)),TelefonNo=’123456789′
SET @i=@i+1
END
T-SQL kodları ile verilerimizi kaydettik. Daha sonrasında ise,
–Aşağıdaki işlemle Kaç logical read yaptığımı gösteren sistemi açtım.
SET STATISTICS IO ON
— Aşağıdaki işlemle Kaç Kaç milisaniye geçtiğini gösteren sistemi açtım.
SET STATISTICS TIME ON
Daha sonra ise
SELECT * FROM dbo.Telefonlar WHERE Ad=’tekin99993′
Olarak select çekin. Ve çıkan verilere göz atın. Daha sonra ise
–Clustered indeks tanımladım
CREATE CLUSTERED INDEX TelefonIndeks ON dbo.Telefonlar(AdresID)
SELECT * FROM dbo.Telefonlar WHERE AdresID=80000
Olarak select çekin. Ve çıkan verilere göz atın. Daha sonra ise
REATE NONCLUSTERED INDEX AdaGoreIndeksle ON dbo.Telefonlar(Ad)
–Non-Clustered indeks tanımladım
SELECT * FROM dbo.Telefonlar WHERE Ad=’Koray99993′
Olarak select çekin. Ve çıkan verilere göz atın. Sonuçlardan farkı göreceksiniz.
Kaynak : http://link.tl/rQVX