0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ダイレクト・ロードに関する新機能を試す(Oracle AI Database 26ai)

0
Posted at

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?