İSİM¶
CLUSTER - 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:
employees tablosunu aynı indeksi kullanarak yeniden sıralamak
için:
Veritabanındaki evvelce sıralanmış tüm
tabloları sıralamak için:
UYUMLULUK¶
SQL standardında
CLUSTER diye bir deyim yoktur.
İLGİLİ BELGELER¶
clusterdb(1).
ÇEVİREN¶
Nilgün Belma Bugüner <nilgun (at)
belgeler·gen·tr>, Nisan 2005