Dev postgres tablosu nasıl çoğaltılır?


29

Devasa postgres masam var (10GB veri - 160M kayıt). Tablo statiktir ve üzerinde herhangi bir yazma işlemi yoktur. Bunu çoğaltmak, yazı yazmak, yeniden indekslemek ve sonra tek hızlı işlemle eskisini silmek ve yenisini yeniden isimlendirmek istiyorum.

Böyle devasa masaları kopyalamanın en hızlı yolu nedir?

Yanıtlar:


55

Genellikle bir tabloyu kopyalamanın en hızlı yolu basitçe:

CREATE TABLE table2 AS SELECT * FROM table1;

Paralel INSERT'ler daha hızlı olabilir, ancak yalnızca çok hızlı bir disk alt sistemiyle (birçok sürücüde veri birleştirildiğinde). Aksi takdirde bu daha yavaş olacaktır.

Değiştirme işlemini tamamladığınızda table2, yeni adı şu şekilde alabilir:

BEGIN;
DROP TABLE table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;

DROP TABLEKomut öngörebildiğiniz isteyebilirsiniz şekilde eşzamanlı okuyucuları etkileyen özel bir kilit, gerekir:

  • DROP Diğer işlemlerden bitinceye kadar, masadaki okunan bekleyenleri bekleyecektir.
  • Bu süre zarfında bu tabloyu okumaya çalışan herhangi bir yeni işlem beklemeye alınacak ve daha sonra orijinal table1olmadığından başarısız olacaktır . Hata gibi görünecektir "could OSB ile değil açık ilişki OID'yi "

İkinci sorunu önlemek için, yeniden adlandırmak olabilir table1 için old_table1 yerine bırakarak arasında ve bu okuyucular onunla bittiğinde sonra ancak bundan sonra dış işlemin ait bırakın. Böylece yukarıdaki dizi olur:

BEGIN;
ALTER TABLE table1 RENAME TO old_table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
...
DROP TABLE old_table1;

2
Teşekkürler dostum. Bu tam olarak aradığım bir açıklama. Tekrar teşekkürler!
Milovan Zogovic

Tablo2'de tanımlanan dizinler varsa, tablo yeniden adlandırıldıktan sonra da çalışmaya devam eder mi?
BamaPookie 19:16

1
@BamaPookie, indeksleri, kısıtlamaları ve varsayılanları içeren tam şema için bunu kontrol edin wiki.postgresql.org/wiki/Clone_schema
Timothy Vogel
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.