SQLトランスパイラ機能は、PL/SQL関数をSQL式に自動的に変換することで、SQLクエリにおける関数呼び出しのオーバーヘッドを削減し、データベースが複雑なクエリを処理する際に基盤となる実行エンジンをより効率的に活用できるようにすることで、クエリ実行効率を向上させることを目的としています。
SQLトランスパイラ機能の有効化
SQLトランスパイラ機能を有効にするには、SQL_TRANSPILERという変数を設定する必要があります。この変数はグローバルレベルまたはセッションレベルで設定でき、SQLトランスパイラの有効状態を柔軟に制御できます。この変数の詳細については、SQL_TRANSPILERを参照してください。
変換メカニズム
SQLトランスパイラは、SQLクエリ内で頻繁に呼び出されるPL/SQL関数を主な対象とします。システムは関数内部のロジックを分析し、それを直接SQL演算に変換できるかどうかを判断します。例えば、関数内に単純な算術演算や文字列処理のみが含まれている場合、SQLトランスパイラはそれを対応するSQL式に変換します。これにより、コンテキストスイッチングによるパフォーマンス低下を抑えるだけでなく、クエリプランをより簡潔明瞭にし、データベースオプティマイザーがより効率的な実行計画を生成しやすくなります。
例
以下のコマンドを実行して、
add_numbersという名前の関数を作成します。obclient> create or replace function add_numbers(a in number, b in number) return number is begin return a + b; end; /以下のコマンドを実行して、最適化が有効になっていない場合の実行計画を確認します。
obclient> EXPLAIN SELECT add_numbers(1, 2) FROM dual; Query Plan ========================================== |ID|OPERATOR |NAME|EST.ROWS|EST.TIME(us)| ------------------------------------------ |0 |EXPRESSION| |1 |1 | ========================================== Outputs & filters: ------------------------------------- 0 - output([ADD_NUMBERS(1, 2)]), filter(nil) values({ADD_NUMBERS(1, 2)})クエリの検証結果を確認します。
obclient> SELECT add_numbers(1, 2) FROM dual; +------------------+ | ADD_NUMBERS(1,2) | +------------------+ | 3 | +------------------+SQLトランスパイラーの最適化を有効にします。
obclient> ALTER session SET sql_transpiler = 'on';最適化を有効にした後の実行計画を確認します。
obclient> EXPLAIN SELECT add_numbers(1, 2) FROM dual; Query Plan ========================================== |ID|OPERATOR |NAME|EST.ROWS|EST.TIME(us)| ------------------------------------------ |0 |EXPRESSION| |1 |1 | ========================================== Outputs & filters: ------------------------------------- 0 - output([:0 + :1]), filter(nil) values({:0 + :1})最適化を有効にした後の実行計画の出力は
output([:0 + :1])に変わります。これは顕著な変化です。データベースのSQLトランスパイラーは、add_numbers関数本体内部のロジック(a + b)を正しく認識し、それを等価なSQL加算式:0 + :1に直接変換しました(ここで :0 と :1 はバインドパラメータのプレースホルダーで、入力値 1 と 2 に対応します)。これは、実際の実行時において、データベースがPL/SQL関数を呼び出すことなく、単純な1+2式を処理するかのように動作することを意味し、実行オーバーヘッドを大幅に削減します。最適化後のクエリ結果を検証します。
obclient> SELECT add_numbers(1, 2) FROM dual; +------------------+ | ADD_NUMBERS(1,2) | +------------------+ | 3 | +------------------+