Aurora PostgreSQL Limitless Database での COPY コマンドの使用
psql ユーティリティの \copy
COPY コマンドを使用して Aurora PostgreSQL Limitless Database にデータをロードする
Aurora PostgreSQL Limitless Database は、データをインポートするための psql ユーティリティの \copy
Aurora PostgreSQL と同様に、Limitless Database では以下はサポートされていません。
-
DB インスタンスへの直接 SSH アクセス – データファイル (.csv 形式など) を DB インスタンスホストにコピーして、ファイルから
COPYを実行することはできません。 -
DB インスタンスでのローカルファイルの使用 –
COPY ... FROM STDINとCOPY ... TO STDOUTを使用します。
PostgreSQL の COPY コマンドには、ローカルファイル (FROM/TO) を操作し、クライアントとサーバー間の接続 (STDIN/STDOUT) を使用してデータを送信するためのオプションがあります。詳細については、PostgreSQL ドキュメントの「COPY
PostgreSQL psql ユーティリティの \copy コマンドは、psql クライアントを実行するコンピュータ上のローカルファイルで動作します。接続先のリモート (Limitless Database など) サーバーで、それぞれの COPY ... FROM STDIN または COPY ... FROM STDOUT コマンドを呼び出します。ローカルファイルから STDIN にデータを読み取るか、STDOUT から書き込みます。
データを複数のファイルに分割する
データは Aurora PostgreSQL Limitless Database の複数のシャードに保存されます。\copy を使用してデータのロードを高速化するには、データを複数のファイルに分割できます。次に、個別の \copy コマンドを並行して実行して、データファイルごとに個別にインポートします。
例えば、CSV 形式の入力データファイルがあり、インポートする行が 300 万行あるとします。このファイルを 20 万行ずつ含むチャンク (15 チャンク) に分割できます。
split -l200000 data.csv data_ --additional-suffix=.csv -d
これにより、data_14.csv を通じてファイル data_00.csv が作成されます。その後、15 の並列 \copy コマンドを使用してデータをインポートできます。次に例を示します。
psql -h dbcluster.limitless-111122223333.aws-region.rds.amazonaws.com -U username -c "\copy test_table from '/tmp/data_00.csv';" postgres_limitless & psql -h dbcluster.limitless-111122223333.aws-region.rds.amazonaws.com -U username -c "\copy test_table FROM '/tmp/data_01.csv';" postgres_limitless & ... psql -h dbcluster.limitless-111122223333.aws-region.rds.amazonaws.com -U username -c "\copy test_table FROM '/tmp/data_13.csv';" postgres_limitless & psql -h dbcluster.limitless-111122223333.aws-region.rds.amazonaws.com -U username -c "\copy test_table FROM '/tmp/data_14.csv';" postgres_limitless
この手法を使用すると、1 つの \copy コマンドを使用する場合と同じ量のデータが約 10 倍速くインポートされます。
COPY コマンドを使用して Limitless Database データをファイルにコピーする
次の例に示すように、\copy
postgres_limitless=> \copy test_table TO '/tmp/test_table.csv' DELIMITER ',' CSV HEADER;