İNDEKS
INDEKSLER İndeks, tablolardan veri çekmek için gerekli sorgular çalıştırılırken gereken süreyi azaltmak amacıyla kullanılır. Veritabanının performansını artırmak için kullanılır. Indeksler hangi kayıtların hangi tablolarda bulunduğunu gösteren kitapların başındakine benzer bir mantığı olan araçlardır. Birkaç kayıt için bu süre pek önem arz etmese de, milyonlarca kayıt olduğu durumda hayati önem taşır.
Tablo Taraması Büyük bir kütüphanedeki görevlinin, demirbaş olarak gelen her kitabı gördüğü ilk boş rafa koyduğunu düşünelim Bu şekilde kitaplar belli bir kurala göre dizilmiyorsa ortaya çıkan yapıya yığıt (heap) denir. Bu kütüphanede, yani kitap tablosunda, okurun aradığı kitabı bulabilmek için bütün kitapları tek tek kontrol etmek gerekir. Bu duruma Tablo Taraması (table scan) denir. Bu işlem, birkaç yüz kayıt için çok sorun olmasa da yüz binlerce kitap için oldukça zor bir işlemdir.
Clustered İndeks Tablo tarama işleminden kaçınmak için, okurun istediği kitabı hızlı bir şekilde bulabilmek için kitapları adlarına göre raflara alfabetik sıralamak en pratik çözümdür. Böylece istenilen bir kitap kolayca bulunur. Bu durumda kitap tablosunda kitap adları sütunu için bir Clustered İndeks tanımlamış oluruz. Clustered İndeks bir tablo üstünde sadece bir adet tanımlanabilir ve verilerin bir niteliğine göre fiziksel olarak sıralanmaları halini ifade etmek için kullanılır. Eğer okurlar kitap adına göre değil de yazar adına göre kitaba ulaşmak isterse?
Nonclustered İndeks Örneğin, Mehmet Akif Ersoy’a ait bir şiir kitabı almak isteyelim. Bu durumda, clustered index aranan kitaba hızlı erişim için faydalı olmaz . (Çünkü kitap adına göre erişim mümkün, “Yaban”, “Ateşten Gömlek” gibi) Çözüm, yazarların adına göre sıralanmış, yazar adından kitap adına geçişi sağlayabilecek şöyle bir liste oluşturmak;
Nonclustered İndeks Bu listeye Nonclustered indeks denir. Nonclustered indeksler bir Clustered indeks veya Heap üstünden hızlı olarak kayıtlara ulaşmak için tanımlanırlar.
Özetle indeksleme Temel Amaç: veriye hızlı erişim Kütüphane örneği üzerinden; Heap : Üstünde hiç veri olmayan tablodur. Yani üstünde hiç bir fiziksel sıralayıcı kural tanımlanmamıştır. tanımlanmamıştır. Clustered indeks: Kitapları adlarına göre alfabetik sıralı olarak raflara yerleştirme. Nonclustered indeks: Raflara sıralama bilgisini kullanarak yeni bir sıralama yapmak.
Özetle indeksleme Nonclustered indeks, ISBN için, sayfa sayısı için veya kitaplar tablosundaki diğer tüm sütunlar için de hazırlanabilir. Az sayıdaki kayıt için tablo taraması hızlı sonuç gönderirken; çok sayıdaki kayıt için Nonclustered indeks avantaj sağlar. SQL server alt programı olan Query Optimiser, tablo için hangi yöntemin daha verimli olacağına karar verir.
Bir tablo için Bir tablo için şu dört durumdan biri geçerlidir: 1. Tablo heap'tır. Yani üstünde hiç bir fiziksel sıralayıcı kural tanımlanmamıştır. 2. Tablo üstünde bir Clustered Indeks tanımlıdır. Bir sütun veya bazen birden fazla sütunun birleşimi, veriler için sıralayıcı unsur olarak verilmiştir. 3. Tablo üstünde bir Nonclustered indeks tanımlanmıştır ama tablo üstünde clustered Indeks bulunmadığı için bu indeks, heap yapısı üstünden çalışmaktadır. 4. Tablo üstünde bir Nonclustered Indeks tanımlanmıştır ve tablo üstünde Clustered Indeks de vardır. Nonclustered Indeks, Clustered Indeks üstünden çalışmaktadır.
VTYS'leri Indeksleri Nerede Kullanır? Noktasal Sorguları Hızlandırmak için: WHERE cümleciğinden sonra belirtilen bir eşitliğe karşılık gelen sonuçları seçerken SQL server, uygun indeks bulursa tabloyu taramak yerine bulduğu indeksi kullanabilir. Örnek: SELECT * FROM Product WHERE productID=322 sorgusu çalıştırıldığında, Primary Key’den dolayı tanımlı olan Clustered Indeks kullanılmıştır.
2. Aralık Tarayan Sorguları Hızlandırmak için: Belli sütunlardaki değerleri bilinen bir aralıkta olan satırları getirmek için yazılan sorguları seçerken SQL server indekslerden yararlanabilir. Aralık tarayan sorgulara örnek olarak, BETWEEN, LIKE veya AND operatörü yardımı ile tanımlanan aralıklar verilebilir. Örnek: Ürün adı “CHA” ile başlayan ürünlerin bir listesini almak istersek; Use Adventureworks SELECT * FROM Product WHERE NAME LIKE ‘CHA%’
3) Tabloları birlikte sorgularken, birincil ve yabancı anahtar eşlemesini daha hızlı yapmak için indeksler kullanılır. 4) Veri tekrarından kaçınmak için Primary Key Constraint ve Unique Constraint olarak tanımlı sütunlar için arka planda indeksler kullanır. 5) ORDER BY kullanıldığında verileri belli sırada daha kısa zamanda döndürebilmek için indeksler kullanılır.
Indeks Oluşturmak İndeks oluşturmak için kullanılabilecek en basit ifade şu şekildedir: CREATE indeks_tipi INDEX indeks_adı ON tablo_adı(sütun_adı) Genel kullanımda; İndeks_tipi: Unique clustered veya sadece clustered, nonclustered şeklinde indeksin tipini belirtir. Tip belirtilmediğinde nonclustered’dir. İndeks_adı: İndekse verilen isim. Tablo_adı: İndeksin tanımlandığı tablo ya da view adı. Sütun_adı: Tablo ya da view’de indekslenmesi istenen sütun veya sütunların ismi.
Örnek Indeks Tanımlaması “Person_Bilgi” tablosunda “Sicil_No” sütunu üstünde Clustered Index tanımlansın. CREATE CLUSTERED INDEX Ind_Sicil ON Person_Bilgi (Sicil_No)
Örnek Indeks Tanımlaması SQL Server’da sıralı indeks oluşturabilir. Sıralı indeks için ASC veya DESC deyimleri sütun adlarıyla beraber kullanılır. Varsayılan sıralama değeri ASC’dir. CREATE INDEX Ind_Brut_Ucret ON Person_Bilgi (Brut_Ucret DESC)
Indeks Türleri 1. Unique İndeks Verilerin tekrarlanmaması için kullanılır. Aynı değerin bir daha girilmesini engeller. UNIQUE indeks, hem clustered hem de nonclustered tipte olabilir. Kısıtlayıcı (Primary Key Constraint veya Unique Constraint) tanımı yapıldığında Unique indeks otomatik olarak oluşur. Kullanıcı bir seçenek belirtmezse Primary Key Constraint SQL Server’ca Unique indeks olarak Unique Constraint’de nonclustered unique indeks olarak belirlenir.
1. Unique İndeks Örnek ALTER TABLE Person_Bilgi ADD CONSTRAINT PK_Sicil PRIMARY KEY(Sicil_No) CLUSTERED
2. Karma (Composite) veya Birleşik İndeks Birbiriyle ilişkili tablolar arasında bir tablonun iki sütunu birincil anahtar olarak belirlenebilir. Bu duruma karmaşık veya birleşik indeks denir.
2. Karma (Composite) veya Birleşik İndeks Örnek ALTER TABLE Personel ADD CONSTRAINT PK_Personel PRIMARY KEY (TCKimlikNo,Sicil_No) CLUSTERED
Indeksleri Yönetmek İndeks Silmek Oluşturulan indeks, işlevini yitirirse silinmesi gerekebilir. Bunun için, DROP INDEX komutu veya indeks özellikleri penceresi kullanılabilir. Genel Kullanımı DROP INDEX indeks_adı ON tablo_adı
“sp_helpindex” Komutu Bir tabloda hangi alanlarda ne tür indekslerin tanımlı olduğunu görmek mümkündür. Bu indeksleri görmek için “sp_helpindex” komutu kullanılır. Genel Kullanımı sp_helpindex tablo_adı