巨大なpostgresテーブルがあります(10GBのデータ-160Mレコード)。テーブルは静的であり、実行された書き込み操作はありません。複製し、書き込みを実行し、インデックスを再作成し、単一の高速トランザクションで古いトランザクションを削除し、新しいトランザクションの名前を元の名前に変更したい。
このような巨大なテーブルを複製する最速の方法は何ですか?
巨大なpostgresテーブルがあります(10GBのデータ-160Mレコード)。テーブルは静的であり、実行された書き込み操作はありません。複製し、書き込みを実行し、インデックスを再作成し、単一の高速トランザクションで古いトランザクションを削除し、新しいトランザクションの名前を元の名前に変更したい。
このような巨大なテーブルを複製する最速の方法は何ですか?
回答:
一般的に、テーブルを複製する最も速い方法は単純です:
CREATE TABLE table2 AS SELECT * FROM table1;
並列INSERTはより高速かもしれませんが、非常に高速なディスクサブシステムを使用する場合のみです(多くのドライブでデータがインターリーブされる場合)。そうしないと、これは遅くなります。
変更が完了したら、次のtable2
ようにして新しい名前を取得できます。
BEGIN;
DROP TABLE table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
このDROP TABLE
コマンドには排他ロックが必要です。これは、予想される方法で並行リーダーに影響を与えます。
DROP
他のトランザクションからのテーブルに対する保留中の読み取りが完了するのを待ちます。table1
のテーブルが存在しないために失敗します。エラーは、「OIDでオープンできませんでした関係のようになります。OID」2番目の問題を回避するために、 これらのリーダーが処理を完了したら、ドロップtable1
するold_table1
代わりにに名前を変更し、後でトランザクションの外部でのみドロップすることができます。したがって、上記のシーケンスは次のようになります。
BEGIN;
ALTER TABLE table1 RENAME TO old_table1;
ALTER TABLE table2 RENAME TO table1;
COMMIT;
...
DROP TABLE old_table1;