CLUSTER(7) bir tabloyu bir indekse göre sıralar

KULLANIM

CLUSTER indeks_ismi ON tablo_ismi
CLUSTER tablo_ismi
CLUSTER

AÇIKLAMA

CLUSTER, PostgreSQL'in ismi tablo_ismi ile belirtilen tabloyu indeks_ismi isimli indeksine göre sıralamasını sağlar. İndeks tablo_ismi tablosunda evvelce tanımlanmış bir indeks olmalıdır.

Bir tablo bu işlem sırasında, indeks bilgisine göre fiziksel olarak sıralanır. Sıralama tek seferlik bir işlemdir: işlemin ardından tablo güncellendiğinde değişiklik sıralama işlemine tabi tutulmaz. Yani yeni eklenen ya da güncellenen bir satırın indeks sırasına uygun olarak saklanmasına çalışılmaz. Eğer bu ya da belirli aralıklarla sıralama yapılmak isteniyorsa, komut yinelenerek yeniden sıralama yaptırılmalıdır.

Bir tablo bir kere sıralandı mı, PostgreSQL sıralama için hangi indeksin kullanıldığını hatırlar. CLUSTER tablo_ismi ile tablo ilk sıralamada kullanılan indeks ile tekrar sıralanacaktır.

CLUSTER parametresiz olarak kullanıldığında, komutu kullanan kullanıcının sahibi olduğu o anki veritabanındaki bütün tablolarda ya da komutu ayrıcalıklı kullanıcı kullanıyorsa bütün veritabanlarındaki bütün tablolarda yeniden sıralama yapılır (Hiç sıralama yapılmamış tablolara dokunulmaz). Bu şekilde kullanım, bir hareketin ya da bir işlevin içinden gerçekleştirilemez.

Bir tablonun sıralanması sırasında üzerinde bir ACCESS EXCLUSIVE kilidi oluşturulur. Bu, tablonun işlem bitene kadar başka her türlü veritabanı işleminden (hem okuma hem yazma) korunmasını sağlar.

PARAMETRELER


indeks_ismi
bir indeksin ismi.

tablo_ismi
Bir tablonun ismi (şema nitelemeli olabilir).

EK BİLGİ

Bir tablo içinde tek bir satıra erişildiği durumlarda verini sırasının aslında önemi yoktur. Ancak, başkalarından daha fazla veriye erişmek ve bunları gruplayan bir indeks kullanmak eğilimindeyseniz, CLUSTER kullanmak yararlı olacaktır. Bir tablodan belli bir aralıkta indeksli değerler ya da çok sayıda satırla eşleşen tek bir indeksli değer isterseniz, indeks, eşleşen ilk satır için bellek sayfasını bir kere tanımladıktan sonra, eşleşen diğer tüm satırlar bir ihtimal zaten aynı bellek sayfasında olacağından CLUSTER'ın hem disk erişiminde hem de sorguyu hızlandırmakta çok yardımı olur.

Sıralama işlemi sırasında, tablonun verisini indeks sırasına göre içeren geçici bir kopyası oluşturulur. Ayrıca tablo üzerindeki her indeksin geçici kopyaları da oluşturulur. Bunun yanında, disk üzerinde en azından tablo ve indeksin toplam boyutunda boş bir alana ihtiyaç olacaktır.

CLUSTER sıralama bilgilerini hatırlayacağından, bir defa sıralanan tablolar kolayca tekrar sıralanabilir ve VACUUM'a benzeyen bir ayarlama ile tabloların belirli zaman aralıklarında yeniden sıralanması sağlanabilir.

Planlamacının tabloların sıralanması hakkında istatistikleri kaydetmesinden dolayı, yeni sıralanmış tablo üzerinde ANALYZE [analyze(7)] çalıştırılması tercih edilmelidir. Aksi takdirde, planlamacı zayıf sorgu planı seçimi yapabilir.

Veriyi sıralamanın başka bir yolu daha vardır. CLUSTER cümlesi özgün tabloyu belirttiğiniz indeks sıralamasını kullanarak yeniden sıralar. Satırlar bellekten indeks sırasına göre çekileceğinden, eğer bellek tablosu sırasızsa, çok büyük tablolarda girdiler farklı bellek sayfalarında olacağından, üstüne bir de takas olarak disk kullanılmak zorunda kalınırsa bu işlem oldukça yavaş olabilir. (PostgreSQL'in bir arabelleği olsa da dev bir tablo genellikle bu arabelleğe sığmaz.) Bir tabloyu sıralamanın diğer bir yolu, istenen sırayı oluşturmak için ORDER BY deyimi içindeki PostgreSQL sıralama kodunu kullanan,

    CREATE TABLE yeni_tablo AS
        SELECT sütun_listesi FROM tablo ORDER BY sütun_listesi;

cümlesini kullanmaktır. Bu, sırasız veri için bir indeksleme yapmaktan genellikle daha hızlıdır. Bundan sonra eski tabloyu silip, yeni_tablo'ya eski tablonun ismini vermek için ALTER TABLE ... RENAME cümlesini kullanın ve tablonun indekslerini yeniden oluşturun. Ancak, bu yaklaşım OID'leri, kısıtları, yabancı anahtar ilişkilerini, kullanıcı izinlerini ve tablonun diğer yardımcı özellklerini korumayacağından, bu öğeler elle yeniden oluşturulmalıdır.

ÖRNEKLER

employees tablosunu emp_ind indeksine göre sıralamak için:

CLUSTER emp_ind ON emp;

employees tablosunu aynı indeksi kullanarak yeniden sıralamak için:

CLUSTER emp;

Veritabanındaki evvelce sıralanmış tüm tabloları sıralamak için:

CLUSTER;

UYUMLULUK

SQL standardında CLUSTER diye bir deyim yoktur.

ÇEVİREN

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