Bagaimana cara menduplikasi tabel postgres besar?

29

Saya memiliki tabel postgres besar (data 10GB - catatan 160 juta). Tabel statis dan tidak ada operasi penulisan yang dilakukan. Saya ingin menduplikat, melakukan menulis, mengindeks kembali dan kemudian dengan satu transaksi cepat hapus yang lama dan ganti nama yang baru menjadi nama asli.

Apa cara tercepat untuk menduplikasi tabel sebesar itu?

Milovan Zogovic
sumber

Jawaban:

55

Secara umum cara tercepat untuk menduplikasi tabel adalah:

CREATE TABLE table2 AS SELECT * FROM table1;

INSERT paralel mungkin lebih cepat, tetapi hanya dengan subsistem disk yang sangat cepat (ketika data disisipkan pada banyak drive). Kalau tidak, ini akan lebih lambat.

Setelah selesai memodifikasi table2, Anda dapat menggunakan nama baru dengan:

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

The DROP TABLEperintah membutuhkan kunci eksklusif, yang mempengaruhi pembaca bersamaan dengan cara Anda mungkin ingin mengantisipasi:

  • DROP akan menunggu pembacaan yang tertunda di meja dari transaksi lain selesai.
  • Setiap transaksi baru yang mencoba membaca tabel itu sementara itu akan menunggu, dan kemudian gagal karena aslinya table1tidak ada lagi. Kesalahan akan terlihat seperti "tidak dapat membuka hubungan dengan OID oid "

Untuk menghindari masalah kedua, Anda dapat mengganti nama table1 menjadi old_table1 alih-alih menjatuhkannya, dan kemudian membuangnya nanti di luar transaksi, saat pembaca selesai melakukannya. Jadi urutan di atas akan menjadi:

BEGIN;
ALTER TABLE table1 RENAME TO old_table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
...
DROP TABLE old_table1;
Daniel Vérité
sumber
2
Terima kasih sobat. Ini adalah jenis penjelasan yang saya cari. Terima kasih lagi!
Milovan Zogovic
Jika ada indeks yang ditentukan pada table2, apakah mereka akan tetap berfungsi setelah tabel diganti namanya?
BamaPookie
1
@BamaPookie lihat ini untuk skema lengkap termasuk indeks, batasan, dan default wiki.postgresql.org/wiki/Clone_schema
Timothy Vogel