İ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