VACUUM FULL ve CLUSTER arasındaki PostgreSQL farkı


13

Veriler tarafından kullanılan 200 GB boyutunda ve 6 dizin tarafından 180 GB boyutunda bir tablo var. % 30 şişirilmiş, bu yüzden işgal ettiği istenmeyen alanı geri almak istiyorum. job_id_idX dizininde kümelenmiştir .

Alanı geri kazanmak için clusterkomut veya vacuum fullkomut kullanmam gerekir mi?

  1. Bu iki komut arasındaki fark nedir?

  2. Bir vacuum fullsütuna göre sırala clusterkomutla aynı mı?

  3. Her iki komutta dizin yeniden oluşturuluyor mu?

  4. Benim durumumda hangisi daha hızlı olacak?

PostgreSQL veritabanının sürümü 9.1


1
Evet, dizinler yeniden oluşturulacak. Daha hızlı olan birkaç şeye bağlıdır, sanırım. Ama kesin olan bir şey var: 'bazı sütunlarla tam emiş' gibi bir şey yok.
dezso

1
VACUUM'un birçok durumda CLUSTER'ı benzer sonuçlar üreten daha iyi bir alternatif (ve bazen de tek alternatif) yapan bir işlemin içinde çalışamayacağını da söyleyeyim.
o

Yanıtlar:


8

Ne yaptığını kontrol etmek için CLUSTER, temelde ilk 10 milyon pozitif tamsayıyı içeren daha önceki bir deneyden bir tablo aldım. Zaten bazı satırları sildim ve başka bir sütun da var, ancak bunlar sadece gerçek tablo boyutunu etkiler, bu yüzden o kadar da ilginç değil.

İlk olarak, VACUUM FULLmasaya fkakoştuktan sonra, boyutunu aldım:

\dt+ fka
                    List of relations
 Schema | Name | Type  |  Owner   |  Size  | Description 
--------+------+-------+----------+--------+-------------
 public | fka  | table | test     | 338 MB | 

O zaman tablonun en başından itibaren verilerin fiziksel sırasını görelim:

SELECT *, ctid FROM fka ORDER BY ctid LIMIT 5;

 id  | col1 |  ctid   
-----+------+---------
   2 | 2    | (0,1)
   3 | 3    | (0,2)
   4 | 4    | (0,3)
   5 | 5    | (0,4)
   6 | 6    | (0,5)

Şimdi bazı satırları silelim:

DELETE FROM fka WHERE id % 10 = 5;
--DELETE 1000000

Bundan sonra, rapor edilen tablo boyutu değişmedi. Şimdi ne yaptığını görelim CLUSTER:

CLUSTER fka USING fka_pkey;

SELECT *, ctid FROM fka ORDER BY ctid LIMIT 5;

 id  | col1 |  ctid   
-----+------+---------
   2 | 2    | (0,1)
   3 | 3    | (0,2)
   4 | 4    | (0,3)
   6 | 6    | (0,4)
   7 | 7    | (0,5)

Ameliyattan sonra tablo boyutu 338'den 296 MB'a değiştirildi. Gönderen ctidsayfasında başlığın fiziksel yer açıklayan sütunun, ayrıca satır eşleştirme boşluk kalmayacak olduğunu görüyoruz id = 5olurdu.

Tupler yeniden sıralandıkça, dizinler doğru yerlere işaret edecek şekilde yeniden oluşturulmalıdır.

Yani fark VACUUM FULLsıraları sıralamıyor gibi görünüyor . Bildiğim kadarıyla, iki komutun kullandığı mekanizmada bazı farklar var, ancak pratik açıdan bu ana (sadece?) Fark gibi görünüyor.


ctidSütunun ne olduğundan emin değildim . Tablodaki satırın fiziksel konumunu tanımlayan bir sistem sütunu olduğu ortaya çıkıyor. postgresql.org/docs/current/ddl-system-columns.html
Gajus

8

VACUUM FULLtablonun tüm içeriğini fazladan boşluk bırakmadan yeni bir disk dosyasına yeniden yazar ve kullanılmayan alanın işletim sistemine döndürülmesini sağlar. Bu yöntem ayrıca tablonun yeni bir kopyasını yazdığı ve işlem tamamlanıncaya kadar eski kopyayı serbest bırakmadığı için fazladan disk alanı gerektirir. Genellikle bu yalnızca tablonun içinden önemli miktarda alan geri kazanılması gerektiğinde kullanılmalıdır.

http://www.postgresql.org/docs/9.1/static/sql-vacuum.html

CLUSTERPostgreSQL'e tablo_adı tarafından belirtilen tabloyu dizin_adı tarafından belirtilen dizine göre kümelendirmesini bildirir. Dizin zaten table_name üzerinde tanımlanmış olmalıdır. Bir tablo kümelendiğinde, dizin bilgisine göre fiziksel olarak yeniden sıralanır ve üzerinde bir ACCESS EXCLUSIVE kilidi elde edilir.

http://www.postgresql.org/docs/9.1/static/sql-cluster.html

ayrıca ilgi çekici : küme sonrası gerekli bir yeniden dizin

Ama belki de ihtiyacınız olan tek şey REINDEX, dizin dizininde saklanan verileri kullanarak bir dizini yeniden oluşturan ve dizinin eski kopyasını değiştiren bir basittir .

http://www.postgresql.org/docs/9.1/static/sql-reindex.html


1
Vay! REINDEX hakkında da güzel ipucu! VAKUM ve KÜMELEN (birkaç kez Canlı yapmak için zaman ve etkileri karşılaştırmaya çalışırken) birkaç tablo daraltmak ve şimdi benim en büyük nesneler aslında endeksler.
mike
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.