CLUSTER(7) | SQL - Dil Deyimleri | CLUSTER(7) |
CLUSTER - bir tabloyu bir indekse göre sıralar
CLUSTER indeks_ismi ON tablo_ismi CLUSTER tablo_ismi CLUSTER
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.
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.
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;
SQL standardında CLUSTER diye bir deyim yoktur.
Nilgün Belma Bugüner <nilgun (at) belgeler·gen·tr>, Nisan 2005
PostgreSQL |