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パッケージの使用による実行のいずれの場合も、上記の制限が適用されます。