CREATE INDEX(7)

İSİM
CREATE INDEX - yeni bir indeks tanımlar

KULLANIM
CREATE [ UNIQUE ] INDEX isim ON tablo [ USING yöntem ]
    ( { sütun | ( ifade ) } [ işleç_sınıfı ] [, ...] )
    [ TABLESPACE tablo_alanı ]
    [ WHERE dayanak ]

AÇIKLAMA
CREATE INDEX belirtilen bir tablo üzerinden bir indeks oluşturur. İndekslerin birincil kullanım amacı veritabanı başarımını arttırmaktır (ancak, uygunsuz kullanımı başarımın düşmesiyle sonuçlanır).

İndeks için anahtar alanları sütun isimleri olarak ya da parantez içinde yazılmış ifadeler olarak belirtilir. İndeksleme yöntemi çoksütunlu indeksleri destekliyorsa, çok sayıda alan belirtilebilir.

Bir indeks alanı tablonun satırındaki bir veya daha fazla sütun değerinden hesaplanan bir ifade olabilir. Bu özellik, bazı temel veri dönüşümlerini temel alan veriye daha hızlı erişim sağlamak için kullanılabilir. Örneğin, upper(col)'a göre hesaplanan bir indeks, WHERE upper(col) = 'JIM' gibi bir deyimin belirtilebilmesini mümkün kılar.

PostgreSQL B-tree, R-tree, hash ve GiST indeksleme yöntemlerini içerir. B-tree indeksleme yöntemi bir Lehman-Yao yüksek bilinirlikli B-tree gerçeklenimidir. R-tree indeksleme yöntemi, Gutman'in dördül ayırma algoritması kullanılarark gerçeklenir. Hash indeksleme yöntemi ise Litwin'in bir gerçeklenimidir. Kullanıcılar da kendi indeksleme yöntemini tanımlayabilir ama bu oldukça karmaşıktır.

WHERE deyiminin varlığında, bir kısmî indeks oluşturulur. Bir kısmî indeks, bir tablonun kalanına göre indeksleme bakımından daha kullanışlı olan bir bölümündeki girdileri içeren bir indekstir. Örneğin, hem toptan hem de perakende siparişleri içeren bir tablomuz olsun, perakende siparişlerin tabloda daha az bulunmasına karşın en sık kullanılanların bunlar olduğunu varsayalım. Sadece bu kayıtlarla ilgili bir indeks oluşturarak başarımı önemli ölçüde arttırabilirsiniz. Başka bir olası kısmî indeks uygulaması, tablonun bir alt kümesindekilerin eşsizliğini sağlamak için WHERE ile UNIQUE'in birlikte kullanımıdır.

WHERE ile kullanılan ifade sadece indekslenen tablonun sütunlarına başvurabilir ama sadece indekslenen değil, bütün sütunlar kullanılabilir. Şimdilik, WHERE deyimi içinde altsorgular ve ortak değer işlevleri de kullanılamamaktadır. Aynı kısıtlamalar ifadelerdeki indeks alanları için de geçerlidir.

Bir indeks tanımında kullanılan bütün işlevler ve işleçler IMMUTABLE imli olmalıdır, yani sonuçlar bunların argümanlarına bağımlı olmalı ve argümanları asla yorumlanabilir olmamalıdır (başka bir tablonun içeriği ya da şimdiki zaman kullanılamaz). Bu sınırlama indeksin davranışının iyi tanımlanmış olmasını sağlar. Bir kullanıcı tanımlı işlevi bir indeks ifadesinde ya da WHERE deyiminde kullanmak istiyorssanız, işlevi tanımlarken IMMUTABLE imli olmasını sağlamayı unutmayın.

PARAMETRELER
UNIQUE
    İndeks oluşturulurken ve her veri eklenişinde, tabloda birbirinin aynı değerler bulunmaması için sistemin sınama yapmasını sağlar. Girdilerin yinelenmesine sebep olacak bir veri girme veya güncelleme işleminin yapılmaya çalışılması bir hata üretecektir.

isim
    Oluşturulacak indeksin ismi; burada şema nitelemeli isimler kullanılamaz. İndeks daima tabloyu içeren şemada oluşturulur.

tablo
    İndekslencek tablonun ismi (şema nitelemeli olabilir).

yöntem
    İndeks için kullanılacak yöntemin ismi. Değer olarak, btree, hash, rtree ve gist verilebilir. btree öntanımlı yöntemdir.

sütun
    Tablo sütunun ismi.

ifade
    Tablonun bir ya da daha fazla sütünu ile ilintili bir ifade. İfade yukarıdaki sözdiziminde gösterildiği gibi parantez içinde yazılmalıdır. Ancak, ifade bir işlev çağrısı biçimindeyse parantez içine alınmayabilir.

işleç_sınıfı
    Bir işleç sınıfının ismi. Ayrıntılar için aşağıya bakınız.

tablo_alanı
    İndeksin oluşturulacağı tablo alanı. Belirtilmezse, default_tablespace yapılandırma değişkeninin değeri; bu değişkene bir değer atanmamışsa veritabanının öntanımlı tablo alanı kullanılır.

dayanak
    Bir kısmî indeks için kısıt ifadesi.

EK BİLGİ
İndekslerin hangi durumlarda yararlı olduğu, hangi durumlarda kullanılmayacağı, ne zaman kullanıldığı gibi bilgileri
http://www.postgresql.org/docs/8.0/static/indexes.html adresinde bulabilirsiniz.

Şimdilik, çok sütunlu indekslerde sadece B-tree ve GiST indeksleme yöntemleri desteklenmektedir. Öntanımlı olarak en fazla 32 alan belirtilebilir. (Bu sınır PostgreSQL kurulum için yapılandırılırken değiştirilebilir.) B-tree şimdilik sadece eşsiz indeksleri desteklemektedir.

Bir işleç sınıfı bir indeksin her sütunu için belirtilebilir. İşleç sınıfı indeks tarafından sütunlar için kullanılacak işleçleri belirler. Örneğin, dört baytlık tamsayılar üzerindeki bir B-tree indeksi int4_ops sınıfını kullanırdı; bu işleç sınıfı dört baytlık tamsayıların karşılaştırma işlevlerini içerir. Uygulamada, sütun türüne göre öntanımlı olan işleç sınıfı genellikle yeterli olur. İşleç sınıflarına sahip olmanın ana esprisi, birden fazla anlamlı sıralaması olabilen bazı veri türlerinin olmasıdır. Örneğin, bir karmaşık sayı veri türü için sıralamayı hem gerçel kısmı hem de mutlak değeri için yapmak isteyebiliriz. Bunu veri türü için iki işleç sınıfı tanımlayarak ve indeksi oluştururken bu sınıflardan birini belirterek yapabilirdik. İşleç sınıfları hakkında daha fazla bilgi edinmek için
http://www.postgresql.org/docs/8.0/static/indexes-opclass.html ve
http://www.postgresql.org/uygulamalar/pgsql/xindex.html adreslerine bakınız.

Bir indeksi kaldırmak için DROP INDEX [drop_index(7)] kullanılır.

İndeksler öntanımlı olarak IS NULL deyimleri için kullanılmazlar. Böyle durumlarda indeksleri kullanmanın en iyi yolu, IS NULL dayatmasını kullanan bir kısmî indeks oluşturmaktır.

ÖRNEKLER
films tablosunun title sütunu üzerinde bir B-tree indeksi oluşturmak için:

    CREATE UNIQUE INDEX title_idx ON films (title);

films tablosunun code sütunu üzerinde bir indeks oluşturup, bu indeksin indexspace tablo alanında kalması için:

    CREATE INDEX code_idx ON films(code) TABLESPACE indexspace;

UYUMLULUK
CREATE INDEX bir PostgreSQL oluşumudur. SQL standardında indeksler için bir bahis yoktur.

İLGİLİ BELGELER
ALTER INDEX [alter_index(7)], DROP INDEX [drop_index(7)].

ÇEVİREN
Nilgün Belma Bugüner <nilgun (at) belgeler·gen·tr>, Nisan 2005