Merhaba arkadaşlar,

Bu ve bundan sonraki birkaç yazımızda SQL server veri tabanı için çok önem arz eden konulara değineceğiz. Bu dersimizde Index kavramından bahsedeceğim.

Indexler milyonlarca kaydın arasında aranan kaydın en kısa sürede bulmaya çalışmaktır. Bir DB üzerinde sorgularınız oldukça geç cevap veriyor ise bu yazı yol göstereceğini umuyorum. Açıkça söylemek gerekirse index mantığını büyük veritabanlarında çalışmadan mantığını öğrenemezsiniz.

Bir veritabanınız var ve içinde 1.000.000 den fazla elemanın olduğunu varsayalım. İçinde bir sorgu çalıştırma için 1 2 sn gibi bekleyeceğinizi düşünebilirsiniz. Ama burada yanılıyorsunuz. Sizi o milyonlarca kaydın arasından bulup istediğiniz sonucu döndürene kadar baya bir bekletiyor. Peki büyük şirketler de bekliyor mudur? Tabi ki hayır! 70.000.000 kaydın tutulduğunu varsayarsak ve bir iki sn de cevabını bulmak istersek ne gibi bir yol izleriz şimdi bu konuya değineceğiz.

Kısacası eğer veriniz oldukça fazla ise ya da 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. SQL de iki farklı index yapısı bulunmaktadır.

  • Clustered Index
  • Non-Clustered Intex

Clustered Index

Mesela siz dersane sahibisiniz. İlk kayıt olan öğrencilerinizin sayısı 20 oldu. İkinci gün kayıt olan öğrenci sayısı 25 oldu. Böylece hafta sonuna kadar her gün bu şekilde kayıt alıyorsunuz ve bir hafta zaman geçti elinizdeki kayıtların toplam sayısı 100’ü açtı. Aynı zamanda bu kayıtları siz her gelen kayıdın üstüne ekliyorsunuz. Kağıtlar devasa bir büyüklüğe ulaştı. Ardından bir gün öğrencinizin biri çıkıp dershane taksitini ödemeye geldi. Şimdi bunca kağıdın arasında o öğrencinizin kaydına kaç saatte ulaşabilirsiniz. Bir düşünün. Ne bir alfabetik sıraya konulmuş ne de bir ayrım yapılmış. Karma karışık kağıtların arasında siz öğrencinizin kağıdını bulmaya çalışıyorsunuz. Sonra baktınız bu böyle olmuyor. Alfabetik sırayla bu işlemi yapmaya koyuldunuz. Artık istenilen kayda öncekinden daha kolay şeklinde bulabiliyorsunuz. İşte nasıl ki burada bir kazanç sağladınız database’de de Clustered Index yapısı oluşturursak aynı şekilde kazanç sağlarız.

Aslında eğer veri tabanı oluşturduysanız daha önce farkında olmadan Clustered Index yapısını kullandınız. Bir tabloda Primary key kullandıysanız bilin ki identity bile verdiniz. İşte bu olay Clustered Index yapısını kullandığınız anlamına geliyor.

Clustered Index yapıldığında sıralanan veriler Leaf’de tutulur. Öğrencilerimizin kaydına bir daha gelecek olursak baş harflerine göre gruplama yaptığımızda ise bu grup bilgileri de Intermadiate Level’larda tutulur. Böylece istenilen kayıt leaf da tutulduğu için daha kısa süre de sorgunuza cevap alabilirsiniz. Bilinmesi gereken en önemli noktalardan birisi bir tabloda sadece 1 tane Clustered Index oluşturulabilir.

Non-Clustered Index

Diyelim ki bir kitap aldınız ve ders çalışacaksınız ve içinden sizin eksik olduğunuz konuyu bulmak için tek tek sayfaları elle çevirip bulmak ister misiniz? Buradan tabi ki hayır cümlesini duyar gibiyim. Gide index sayfasından konunun kaçıncı sayfadan başladığını bulursunuz ve içinde sizin eksik olduğunuz bölüme gelirsiniz. İşte bu yaptığınız ise Non-Clustered Indexleme yapısı oluyor. Bu yapıda Leaf level’larda verinin bulunduğu adres bulunur. Daha sonra tekrardan leaf’ten Root’a çıkılır ve aşağıya doğru inilerek verinin kendisine ulaşılır. Non-Clustered Indemleme ile bir tabloya 999 tane yapılabilir. Fakat nasılsa yapılıyor diye bu kadar da yapmanın bir anlamı olamaz herhalde. En güzeli en fazla sorgu çektiğiniz tabloya yapmak ve akıllıca olanını yapmak olacaktır.

Index Kullanımı

CREATE [ CLUSTERED | NONCLUSTERED ] INDEX isim ON tablo ( { kolon | ( ifade ) }
Örnek:

DECLARE @i INT
SET @i=0
WHILE(@i<100000)
BEGIN
INSERT INTO Ogrenciler
SELECT Ad='Sümeyra'+CAST(@i AS nvarchar(30)),SoyAd='Akbıyık'+CAST(@i AS NVARCHAR(30)),TelefonNo='123456789'
SET @i=@i+1
END

Verilerimizi böylece kaydetmiş olduk. Aşağıdaki kodla kaç milisaniyede yanıt vermiş bakalım.

SET STATISTICS TIME ON

Daha sonra ise

SELECT * FROM Ogrenciler WHERE Ad='Sümeyra98943'

Sorgumuzu çalıştıralım ve sonucuna dikkat edelim.

Şimdi Clustered indeks tanımladım.

CREATE CLUSTERED INDEX OgrenciIndeks ON Ogrenciler (AdresID)

SELECT * FROM Ogrenciler WHERE AdresID=60000

Sorgumuzu çekelim ve çıkan sonuca göz atalım.

REATE NONCLUSTERED INDEX AdaGoreIndeksle ON Ogrenciler(Ad)

Non-Clustered indeks tanımladım.

SELECT * FROM Ogrenciler WHERE Ad='Sümeyra98943'

Sorgusunu çalıştırın ve sonucu karşılaştırın. İkisi arasında bulunan farkı göreceksiniz.

Kategoriler: SQL

Sümeyra Akbıyık

hakkımdaki her şeyi bu blogda bulabilirsin. Haydi sende bir göz gezdirmeye ne dersin?

Bir cevap yazın

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