記事「PostgreSQLバルクデータロードの7つのベストプラクティスのヒント」の無料翻訳
場合によっては、いくつかの簡単な手順で大量のデータをPostgreSQLデータベースにロードする必要があります。この方法は一般に一括インポートと呼ばれ、1つ以上の大きなファイルがデータソースとして機能します。このプロセスは、許容できないほど遅くなる場合があります。このパフォーマンスの低下にはいくつかの理由があります。インデックス、トリガー、外部キーとプライマリキー、またはWALファイルの書き込みでさえ、遅延を引き起こす可能性があります。
この記事では、データをPostgreSQLデータベースに一括インポートするための実用的なヒントをいくつか紹介します。ただし、それらのいずれも問題の効果的な解決策ではない場合があります。適用する前に、どの方法の長所と短所も検討することをお勧めします。
ヒント1.ターゲットテーブルをログなしモードにする
PostgreSQL9.5以降では、ターゲットテーブルを非ログモードに設定し、データのロード後にログモードに戻すことができます。
ALTER TABLE <target table> SET UNLOGGED;
<bulk data insert operations…>
ALTER TABLE <target table> LOGGED;
, PostgreSQL (WAL). . , , PostgreSQL . PostgreSQL .
, – . . , , , .
:
- c ;
- ;
- , , .
2.
. , , .
, -, , . , , , , .
DROP INDEX <index_name1>, <index_name2> … <index_name_n>
<bulk data insert operations…>
CREATE INDEX <index_name> ON <target_table>(column1, …,column n)
maintenance_work_mem. .
, . : . , , .
3.
, , – , . PostgreSQL .
, , . , , , .
ALTER TABLE <target_table>
DROP CONSTRAINT <foreign_key_constraint>;
BEGIN TRANSACTION;
<bulk data insert operations…>
COMMIT;
ALTER TABLE <target_table>
ADD CONSTRAINT <foreign key constraint>
FOREIGN KEY (<foreign_key_field>)
REFERENCES <parent_table>(<primary key field>)...;
, maintenance_work_mem .
4.
INSERT DELETE ( ) . , , , .
, . , .
ALTER TABLE <target table> DISABLE TRIGGER ALL;
<bulk data insert operations…>
ALTER TABLE <target table> ENABLE TRIGGER ALL;
5. COPY
PostgreSQL – COPY . COPY . , INSERT INSERT- VALUE
COPY <target table> [( column1>, … , <column_n>)]
FROM '<file_name_and_path>'
WITH (<option1>, <option2>, … , <option_n>)
COPY:
- , , ;
- ;
- ;
- WHERE.
6. INSERT VALUE
INSERT – . , INSERT , , WAL.
INSERT VALUE .
INSERT INTO <target_table> (<column1>, <column2>, …, <column_n>)
VALUES
(<value a>, <value b>, …, <value x>),
(<value 1>, <value 2>, …, <value n>),
(<value A>, <value B>, …, <value Z>),
(<value i>, <value ii>, …, <value L>),
...;
INSERT VALUES . .
, , , PostgreSQL INSERT VALUES. INSERT, RAM , .
effective_cache_size 50%, shared_buffer 25% . , , INSERT VALUES, 1000 .
7. ANALYZE
, ANALYZE . , , . , . ANALYZE .
データベースアプリケーションのデータの一括インポートは毎日行われるわけではありませんが、クエリのパフォーマンスには影響します。そのため、ロード時間を可能な限り短縮することが不可欠です。予期しない事態が発生する可能性を最小限に抑えるためにDBAができることの1つは、同様のサーバーと同様に構成されたPostgreSQLを使用してテスト環境で負荷の最適化を実行することです。データの読み込みにはさまざまなシナリオがあり、それぞれの方法を試して、適切に機能する方法を選択することをお勧めします。