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