CREATE INDEX(7) | SQL - Dil Deyimleri | CREATE INDEX(7) |
CREATE INDEX - yeni bir indeks tanımlar
CREATE [ UNIQUE ] INDEX isim ON tablo [ USING yöntem ] ( { sütun | ( ifade ) } [ işleç_sınıfı ] [, ...] ) [ TABLESPACE tablo_alanı ] [ WHERE dayanak ]
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.
İ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.
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;
CREATE INDEX bir PostgreSQL oluşumudur. SQL standardında indeksler için bir bahis yoktur.
ALTER INDEX [alter_index(7)], DROP INDEX [drop_index(7)].
Nilgün Belma Bugüner <nilgun (at) belgeler·gen·tr>, Nisan 2005
PostgreSQL |