PLSQLで大量のデータを高速でインポートする方法
PL/SQLでは標準のINSERT文で大量データの挿入が可能なものの、データ量が非常に大きい場合は処理が遅くなる場合があります。大量データの高速インポートには、以下のような方法を検討してください。
- BULK COLLECT文とFORALL文を利用: BULK COLLECTは問い合わせ結果のデータ集合を一度に1つのコレクション型変数にまとめ、FORALL文はコレクション内のデータを一度にまとめて対象テーブルに挿入することができます。これにより、データベースとPL/SQLエンジンとのやり取りの回数が減り、データのインポート速度が向上します。
ネイティブな日本語で、1 つのオプションのみで言い換えます。
DECLARE
TYPE data_type IS TABLE OF table_name%ROWTYPE;
data data_type;
BEGIN
SELECT * BULK COLLECT INTO data FROM source_table;
FORALL i IN 1 .. data.COUNT
INSERT INTO target_table VALUES data(i);
COMMIT;
END;
- 外部テーブルを使う。外部テーブルというのは、外部ファイルのデータが読める特別なテーブルのこと。データをテキストファイルに保存しておき、そのファイルを読み込む外部テーブルを作成しておいて、最後に、INSERT INTO SELECT文を使って外部テーブルからデータを行先テーブルに挿入します。
示範コード:
CREATE TABLE external_table (
column1 datatype,
column2 datatype,
...
)
ORGANIZATION EXTERNAL (
TYPE oracle_loader
DEFAULT DIRECTORY directory_name
ACCESS PARAMETERS (
RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY ',' (column1, column2, ...)
)
LOCATION ('filename.csv')
);
INSERT INTO target_table (column1, column2, ...)
SELECT column1, column2, ...
FROM external_table;
COMMIT;
以上二つの方法は大量データを高速でインポートするための一般的な方法であり、実際の使用時には具体的な状況に応じて適した方法を選択できます。