Kategoriler
Anlatım Bilgisayar Bilimleri

Indeksler (Veritabanı)

Indeksler iki kategoriye ayrılır. Bunlar kümelenmiş (clustered index) ve kümelenmemiş (non-clustered index) indekslerdir. SQL Serverda kümelenmiş indekslerde kayıtlar tablodaki bir kolona göre sıralanır. O kolonda yer alan bilgiler tekrar etmez. Yani isim kolonunu kümelenmiş indeks olarak tanımladığımız zaman o kolona iki tane Ali isimli kayıt giremeyiz. Eğer bir tabloda birincil indeks kısıtlaması (primary key constraint) veya özgün indeks kısıtlaması (unique key constraint) varsa bu kolonlardan biri kümelenmiş indeks olarak tanımlanabilir. Bununla birlikte bir tabloda doğası gereği sadece bir tane kümelenmiş indeks bulunur. Düşünelim ki, SQL Server aynı tabloya iki tane kümelenmiş indeks tanımlamaya izin verdi. Bizde önce isime daha sonra soyada göre kümelenmiş indeks tanımladık. SQL Server önce isime göre kayıtları sıralasın. Daha sonra soyada göre kayıtları sıralamaya çalıştığında bu sefer isim sırası karışır. Bu nedenle aynı tabloya birden fazla kümelenmiş indeks tanımlamak mümkün değildir. Kümelenmiş indeksler aralık sorgularında yüksek performansı gösterir. Bununda nedeni basittir. Kayıtlar sıralı olduğu için aralığın başını ve sonunu bulmak için çok zaman kaybedilmez. Örneğin para kolonu kümelenmiş indeksle tanımlı olsun ve biz sorgumuzda üç bin dolar ile yedi bin dolar arasında maaşı olanları elde etmek istiyoruz. Bu durumda ilk üç bin dolar kazanan kişiden en son yedi bin dolar kazanan kişiye kadar aşağı doğru kayıtlar kullanıcıya getirilir. Kullanım olarak bir tablo üzerinde başka indeksler tanımlanmadan önce kümelenmiş indeksi tanımlamakta fayda vardır. Bununla birlikte SQL Server kümelenmiş indeksi iki nedenden dolayı kullanır. Biri yukarıda da bahsettiğimiz gibi aralık sorgularıdır. Diğer ise arama sorgularında kullanılır. Kümelenmemiş indeksler doğrudan verilere erişemez. Yığın (heap) üzerözgüninden ya da kümelenmiş indeks üzerinden verilere erişebilir. Eğer yığın olarak tanımlanırsa (yani kümelenmiş indeks tablo üzerinde kullanılmıyorsa) her satır, satır numarasıyla (row id) tutulur. Satır numarası dosya numarası, satır numarası ve sayfa içindeki satır sayısından tutulur. Eğer kümelenmiş indeks varsa kümelenmiş indeks üzerinden çalışır.

Bir tablo üzerinde bir sütun bilgilerinin tekrarlanmamasını istiyorsak bunun için özgün indeks (unique index) kullanılır. Özgün indeks hem kümelenmiş hemde kümelenmemiş indeks ile birlikte kullanılabilir. Birincil kısıtlama (primary key) veya özgün kısıtlama (unique key) tanımladığı zaman özgün indeks otomatik olarak tanımlanmış olur. Bu oluşum yapılırken indeksin kümelenmiş olup olmayacağı belirtilmelidir. Kullanıcı bir seçenek belirtmezse birincil anahtar kısıtlaması (Primary Key Constraint) SQL Server’ca özgün indeks olarak özgün kısıtlamada (Unique Constraint) kümelenmemiş özgün indeks olarak belirlenir.

Bir tablo üzerinde indeks tanımlamak için T-SQL ifadesi kullanılabilir. Bu işlem aynı zamanda Microsoft SQL Server Management Studio kullanılarak grafik ekran üzerinden de yapılabilir. T-SQL olarak tanımlama yapmak için aşağıdaki SQL kodunu kullanmak yeterlidir.

CREATE index_tipi INDEX index_adı ON tablo_adı(sütun_adı)

İndeks tipinden ifade edilmek istenen şey indeksin kümelenmiş mi yoksa kümelenmemiş mi olduğunu belirtmek için kullanılır. UNIQUE, CLUSTERED yada NONCLUSTERED yazılabilir.

Daha ayrıntılı bir şekilde indeks oluşturmak için aşağıdaki kodları inceleyebilirsiniz.
(Books Onlinedan alıntıdır. Adres: http://msdn.microsoft.com/en-us/library/ms188783.aspx)

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
    ON <object> (column_name [ ASC | DESC ] [ ,…n ] )
    [ WITH <backward_compatible_index_option> [ ,…n ] ]
    [ ON { filegroup_name | “default” } ]

<object> ::=
{
    [ database_name. [ owner_name ] . | owner_name. ]
    table_or_view_name
}

<backward_compatible_index_option> ::=
{
    PAD_INDEX
  | FILLFACTOR = fillfactor
  | SORT_IN_TEMPDB
  | IGNORE_DUP_KEY
  | STATISTICS_NORECOMPUTE
  | DROP_EXISTING
}