OceanBaseデータベースはコンパイル時に、ストアドプロシージャ内にDML文やパッケージ変数の読み書きが含まれるかどうかなどの要素を収集します。この情報は主に、UDF(User-Defined functions)やTriggerを含むDML文の並列実行が必要かどうかを、ネストされたシナリオで判断するために使用されます。
機能の適用範囲
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみ提供しています。
ストアドプロシージャでは以下の情報が収集されます:
- ストアドプロシージャ内部に読み書きSQL文(DML/DDL/TCL文を含む)があるかどうかの分析。
- ストアドプロシージャ内部でパッケージ変数を読み書きしているかどうかの分析。
- ストアドプロシージャ内部にSequenceが存在するかどうかの分析。
- ストアドプロシージャ内部で他のストアドプロシージャにアクセスしているかどうか。
UDF/Triggerを関連付けたDML文の並列実行に関する説明
UDF/Triggerを関連付けたDML文を並列実行する場合、対応するストアドプロシージャに並列実行への影響因子が存在すると、自動的に並列実行を禁止し、直列実行に切り替えます。同時に、parallel_enable句を使用してUDFの並列実行機能を強制的に有効にすることもできます。ユーザーがUDFを作成する際にparallel_enable句を指定し、そのUDFに関連付けられたPDML文を定義すると、UDF内部に並列実行への影響因子があるかどうかに関係なく、強制的に並列実行されます。
以下の一般的なPDMLがUDF/Triggerの実行をトリガーする場合、並列実行は直列実行に切り替えられます:
PDML文がトリガーしたUDFまたはTrigger内部にDML文が存在する場合。
PDML文がトリガーしたUDFまたはTrigger内部に
SELECT文が存在する場合。PDML文がトリガーしたUDFまたはTrigger内部でパッケージ変数の読み書き、外部ストアドプロシージャやグローバルオブジェクトへのアクセスがある場合。
注意
並列クエリ文が関連付けるUDF内部にSELECT文のみが含まれる場合、並列実行を許可します。
SQL文がトリガーするUDF(Trigger)には、以下の制限があります:
- 外部SQL文がクエリまたはDML文の場合、UDFはトランザクションを終了したり、Savepointを作成またはロールバックしたり、
ALTER SYSTEM/ALTER SESSIONを実行したりすることはできません。 - 外部SQLがDML文の場合、UDF内部では同一のテーブルを読み書きすることはできません。
PLからの呼び出し、関数本体への直接埋め込み、EXECUTE IMMEDIATE文の使用による実行、またはDBMS_SQLパッケージの使用による実行に関わらず、上記の制限が適用されます。