1. ホーム
  2. データベース
  3. ポストグレスキュー

PostgreSQLでデータの一括インポートのパフォーマンスを向上させるn個の方法を説明します。

2022-01-10 20:50:13

キーワード:バルクデータインポート、データロード、バルクインサート、高速化、スピードアップ
選択肢が多様化した時代、人生の多くのことがそうであるように、何事も決まった方法、やり方があるわけではありません。白猫、黒猫にかかわらず、ネズミを捕まえられる方がいい猫であり、自分に合ったものが一番いいのです。

ここでは、データの一括インポートのパフォーマンスを向上させるための正式な方法を紹介します。

方法1:自動コミットを無効にする。

psql
\set AUTOCOMMIT off

Other
BEGIN;
Execute bulk data import
COMMIT;

方法2:テーブルをUNLOGGEDに設定する。

データをインポートする前にテーブルをUNLOGGEDモードに変更し、インポートが完了したらLOGGEDモードに戻す。

ALTER TABLE tablename SET UNLOGGED;
Perform a bulk data import
ALTER TABLE tablename LOGGED;

長所
インポート情報をWALログに記録しないため、ioを大幅に削減し、インポート速度を向上させることができます。
デメリット
1. REPLICATION 環境では、テーブルを UNLOGGED モードに設定することはできません。
2. 停電などでインポート処理が正常に終了せず、データベース内のUNLOGGEDテーブルのデータがすべて失われます。

方法3:インデックスを再構築する。

データをインポートする前に当該テーブルのインデックスを削除し、インポート完了後にインデックスを再作成する。

DROP INDEX indexname;
Execute a bulk data import
CREATE INDEX ... ;

テーブルのインデックス定義を問い合わせるためのメソッド

select * from pg_indexes where tablename = 'tablename' and schemaname = 'schemaname';

方法4.外部キーを再構築する。

データをインポートする前に当該テーブルの外部キーを削除し、インポート完了後に再作成してください。

ALTER TABLE ...
 DROP CONSTRAINT ... ;
Perform a bulk data import
ALTER TABLE ...
 ADD CONSTRAINT ... 
 FOREIGN KEY ...
 REFERENCES ... ; 

関連する情報はpg_constraintにあります。

方法5:トリガーを無効にする

データをインポートする前に、当該テーブルのトリガーを無効にし、インポート完了後に再度有効にする。

ALTER TABLE tablename DISABLE TRIGGER ALL; 
Perform a bulk data import
ALTER TABLE tablename ENABLE TRIGGER ALL;

関連する情報はpg_triggerにあります。

方法6:挿入してコピーする

COPYは、データの一括読み込みに最適化されています。

COPY ... FROM 'xxx';

方法7:1値挿入から多値挿入へ

sqlのパース時間を短縮する。

方法8:INSERTからPREPAREにする

PREPARE prep文を使って構文解析の消費量を削減する。

PREPARE fooplan (int, text, bool, numeric) AS
 INSERT INTO foo VALUES($1, $2, $3, $4);
EXECUTE fooplan(1, 'Hunter Valley', 't', 200.00);

方法9:パラメータを変更する

maintenance_work_memを増やし、max_wal_sizeを増やします。

方法10:アーカイブモードをオフにし、walログレベルを下げます。

archive_mode パラメータを変更し、アーカイブのオン/オフを制御します。wal_levelの値をminimalに下げて、ロギングを削減します。
この方法は、データベースの再起動が必要なため、ダウンタイムの計画が必要です。また、レプリケーションバックアップがある場合は、その影響も考慮してください。

PostgreSQLのバルクデータインポートのパフォーマンスを向上させるn個の方法についてのこの記事は終わりです。PostgreSQLのバルクデータインポートに関する詳細については、スクリプトハウスの過去の記事を検索するか、以下の関連記事を引き続きご覧ください。