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;