.\" http://belgeler.org \- 2018\-02\-08T10:38:20Z .TH "CLUSTER" 7 "" "PostgreSQL" "SQL \- Dil Deyimleri" .nh .PD 0 .SH İSİM CLUSTER \- bir tabloyu bir indekse göre sıralar .SH KULLANIM .nf \fBCLUSTER\fR \fIindeks_ismi\fR \fBON\fR \fItablo_ismi\fR \fBCLUSTER\fR \fItablo_ismi\fR \fBCLUSTER\fR .fi .SH AÇIKLAMA \fBCLUSTER\fR, PostgreSQL\N'39'in ismi \fItablo_ismi\fR ile belirtilen tabloyu \fIindeks_ismi\fR isimli indeksine göre sıralamasını sağlar. İndeks \fItablo_ismi\fR 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. \fBCLUSTER \fR\fItablo_ismi\fR ile tablo ilk sıralamada kullanılan indeks ile tekrar sıralanacaktır. \fBCLUSTER\fR 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 \fBACCESS EXCLUSIVE\fR 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. .SH PARAMETRELER .br .ns .TP \fIindeks_ismi\fR bir indeksin ismi. .TP \fItablo_ismi\fR Bir tablonun ismi (şema nitelemeli olabilir). .PP .SH 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, \fBCLUSTER\fR 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 \fBCLUSTER\fR\N'39'ı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. \fBCLUSTER\fR sıralama bilgilerini hatırlayacağından, bir defa sıralanan tablolar kolayca tekrar sıralanabilir ve \fBVACUUM\fR\N'39'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 \fBANALYZE\fR [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. \fBCLUSTER\fR 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\N'39'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 \fBORDER BY\fR deyimi içindeki PostgreSQL sıralama kodunu kullanan, .nf \fB CREATE TABLE\fR \fIyeni_tablo\fR \fBAS \ SELECT\fR \fIsütun_listesi\fR \fBFROM\fR \fItablo\fR \fBORDER BY\fR \fIsütun_listesi\fR; .fi 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, \fIyeni_tablo\fR\N'39'ya eski tablonun ismini vermek için \fBALTER TABLE ... RENAME\fR cümlesini kullanın ve tablonun indekslerini yeniden oluşturun. Ancak, bu yaklaşım OID\N'39'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. .SH ÖRNEKLER employees tablosunu emp_ind indeksine göre sıralamak için: .RS 4 .nf CLUSTER emp_ind ON emp; .fi .RE employees tablosunu aynı indeksi kullanarak yeniden sıralamak için: .RS 4 .nf CLUSTER emp; .fi .RE Veritabanındaki evvelce sıralanmış tüm tabloları sıralamak için: .RS 4 .nf CLUSTER; .fi .RE .SH UYUMLULUK SQL standardında \fBCLUSTER\fR diye bir deyim yoktur. .SH İLGİLİ BELGELER \fBclusterdb(1)\fR. .SH ÇEVİREN Nilgün Belma Bugüner , Nisan 2005