İ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