libpqxx を使用して、大量のデータ (約 7.000.000 エントリ) を PostgreSQL データベースに一括ロードする必要があります。データベースにデータを入力する方法に関するドキュメントを読みましたが、私の場合にこれを使用する方法がわかりません。まず、ファイルを使用できないため、データベース上のCOPYは論外です。また、ロードしているデータベースとテーブルは、インポート中に機能する必要があります。
シナリオは次のとおりです。すべてのデータ (既存のエントリを含む) を含むファイルを別のアプリケーションから定期的に (約 1 か月に 1 回) 取得します。エントリの量が多いため、各エントリの存在を確認することはできず、(前処理後に) 新しいデータを一括挿入するだけです。
現在、これを処理するために、新しいテーブルを作成し、libpqxx のテーブルライターを使用して (トランザクションなしで) データを挿入し、トランザクションで古いテーブルの名前を変更し、新しいテーブルを正しい場所に変更します。
また、これは 1 つのテーブルに対してだけでなく、レイアウトが異なる複数のテーブルに対して行う必要があります。したがって、テーブルの書き込みと日付の解析を分離しようとしました。ここで、テーブルの作成を除外する必要があります。このために私は
create temporary table foo_temp (like foo including indexes including defaults including constraints );
このようにして、次のようなテーブルが得られ、foo
実際に書いている場所のレイアウトを知る必要はありません。ただし、これにより、インデックスと制約を含むテーブルが生成され、上記のガイドでは、インデックスによって一括挿入が遅くなるという問題が残ります。ただし、インデックスと制約を削除した場合 (または最初にコピーしなかった場合) は、元のテーブルに設定されていたのと同じ方法で後で再作成する方法が必要です。
これを迅速に処理する方法に関する良いヒントはありますか?
編集:
関連する側面: 先ほど気付いたデータベースをいじってみると、CREATE TABLE
上記は外部キー制約をコピーしないため、これらも手動で指定する必要があるようです。または、これらを他のすべての制約と一緒に処理する方法はありますか?