Oracle AI Database 26ai ではダイレクト・ロードに関するいくつかの新機能が追加されました。本記事ではダイレクト・ロードと、SQL*Loader の自動パラレル・ロード機能について検証しています。
トランザクション内で複数ダイレクトロード
Oracle AI Database 26ai では、単一トランザクション内で複数回のダイレクト・ロードができるようになりました。
旧バージョンの制限
旧バージョンでは単一トランザクション内に複数のダイレクト・ロードは実行できませんでした。下記の例では Oracle Database 19c 上で APPEND ヒント付きの INSERT 文を単一トランザクション内で実行しています。その結果「ORA-12838: cannot read/modify an object after modifying it in parallel」が発生しています。この状態では更新だけでなく、SELECT 文の発行でも同じエラーが発生します。エラーを解消するために COMMIT 文を実行してトランザクションを終了しています。
SQL> SHOW AUTOCOMMIT;
autocommit OFF
SQL> INSERT /*+ APPEND */ INTO data2 SELECT * FROM data1;
1000000 rows created.
SQL> INSERT /*+ APPEND */ INTO data2 SELECT * FROM data1;
INSERT /*+ APPEND */ INTO data2 SELECT * FROM data1
*
ERROR at line 1:
ORA-12838: cannot read/modify an object after modifying it in parallel
SQL> SELECT COUNT(*) FROM data2;
SELECT COUNT(*) FROM data2
*
ERROR at line 1:
ORA-12838: cannot read/modify an object after modifying it in parallel
SQL> COMMIT;
Commit complete.
Oracle AI Database 26ai の新機能
Oracle AI Database 26ai ではダイレクト・ロードが同一トランザクション内や複数セッションにより同時実行できるようになりました。APPEND ヒント付きの INSERT 文を複数回実行してもエラー「ORA-12838」は発生しません。またトランザクション内での SELECT 文も実行できます。
SQL> SHOW AUTOCOMMIT;
autocommit OFF
SQL> INSERT /*+ APPEND */ INTO data2 SELECT * FROM data1;
1000000 rows created.
SQL> INSERT /*+ APPEND */ INTO data2 SELECT * FROM data1;
1000000 rows created.
SQL> SELECT COUNT(*) FROM data2;
COUNT(*)
----------
3000000
SQL> ROLLBACK;
Rollback complete.
SQL> SELECT COUNT(*) FROM data2;
COUNT(*)
----------
2000000
他のセッションからの更新
複数のセッションから単一テーブルに対して同時にダイレクトロードを行った場合は、後発のロードは待機状態になります。元のセッションが確定(COMMIT または ROLLBACK)した段階で、ロードが継続されます。
自動パラレル・ロード
Oracle AI Database 26ai の新機能である自動パラレル・ロードの検証を行いました。
新機能の概要
単一テーブルに対する SQLLoader の処理を並列化するには入力ファイルを分割し、複数の SQLLoader プログラムを同時実行してダイレクト・パラレル・ロードを行う必要がありました。Oracle AI Database 26ai では、単一の入力ファイルでも並列ロードが可能になっています。
SQL*Loader のオプション
自動パラレル・ロード機能を使用するために必要なオプションは以下の通りです。
| パラメーター名 | 説明 | デフォルト値 |
|---|---|---|
| PARALLEL | 並列処理を実行する | FALSE |
| OPTIMIZE_PARALLEL | 自動並列処理機能の有効化 | TRUE |
| DEGREE_OF_PARALLELISM | 並列度の設定 | NONE |
| MULTITHREADING | マルチスレッド最適化 | FALSE |
PARALLEL パラメーターを TRUE に設定します。並列度は自動的に決定されますが、指定する場合は DEGREE_OF_PARALLELISM で指定します。
実行例
SQL*Loader の自動ダイレクト・ロードを実行します。
制御ファイル
制御ファイルの記述は基本的に変わりませんが、ロードするモードとして APPEND_PARALLEL を指定する必要があります。
LOAD DATA CHARACTERSET AL32UTF8
INFILE 'DATA1_DATA_TABLE.csv'
BADFILE 'DATA1_DATA_TABLE.bad'
DISCARDFILE 'DATA1_DATA_TABLE.dis'
APPEND_PARALLEL INTO TABLE data1
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(
col1 CHAR,
col2 CHAR
)
APPEND_PARALLEL を指定せず、APPEND のみの場合、以下のエラー・メッセージが出力されます。
$ sqlldr userid=scott/{Password}@localhost:1521/ORCLPDB1 control=data1.ctl log=data1.log direct=true parallel=true degree_of_parallelism=4
SQL*Loader: Release 23.26.1.0.0 - Production on Tue Apr 14 11:26:28 2026
Version 23.26.1.0.0
Copyright (c) 1982, 2026, Oracle and/or its affiliates. All rights reserved.
Path used: Direct
Main Thread:
SQL*Loader-658: parallel append loads must specify APPEND_PARALLEL
Load completed - logical record count 0.
以下の例では 1,000,000 件の CSV ファイルを並列度 4 を指定して実行しています。1,000,000 件の CSV ファイルから DATA1 テーブルに対して 250,000 件毎に4並列で実行されていることがわかります。
$ sqlldr userid=scott/{Password}@localhost:1521/ORCLPDB1 control=data1.ctl log=data1.log direct=true parallel=true degree_of_parallelism=4
SQL*Loader: Release 23.26.1.0.0 - Production on Tue Apr 14 11:54:50 2026
Version 23.26.1.0.0
Copyright (c) 1982, 2026, Oracle and/or its affiliates. All rights reserved.
Path used: Direct
Table DATA1:
Reader: Thread 1
Granules/Files Assigned: 1
Rows Assigned: 1000000
Table DATA1:
Loader: Thread 2
Rows Assigned: 250000
250000 Rows successfully loaded.
Table DATA1:
Loader: Thread 3
Rows Assigned: 250000
250000 Rows successfully loaded.
Table DATA1:
Loader: Thread 4
Rows Assigned: 250000
250000 Rows successfully loaded.
Table DATA1:
Loader: Thread 5
Rows Assigned: 250000
250000 Rows successfully loaded.
Load completed - logical record count 1000000.
Table DATA1:
Main Thread
Total Granules/Files Assigned: 1
1000000 Total rows for all threads successfully loaded.
Check the log file:
data1.log
for more information about the load.
MUTITHREADING オプション
デフォルトではマルチスレッド最適化はオフになっています。MUTITHREADING=TRUE オプションを指定することで、最適化機能を有効化できます。このオプションを指定しない場合、ログファイルに以下の記述が追加されます。
Direct path multithreading optimization is disabled
マニュアル
詳細はOracle AI Database 26ai: Database Utility Manual を参照してください。
Author: Noriyoshi Shinoda / Date: April 14, 2026