SQLトランスパイラ機能は、PL/SQL関数をSQL式に自動的に変換することで、SQLクエリにおける関数呼び出しのオーバーヘッドを削減し、データベースが複雑なクエリを処理する際に基盤となる実行エンジンをより効率的に活用できるようにすることで、クエリ実行効率を向上させることを目的としています。
SQLトランスパイラ機能の有効化
SQLトランスパイラ機能を有効にするには、SQL_TRANSPILERという変数を設定する必要があります。この変数はグローバルレベルまたはセッションレベルで設定できるため、SQLトランスパイラの有効状態を柔軟に制御できます。この変数の詳細については、SQL_TRANSPILERを参照してください。
変換メカニズム
SQLトランスパイラは、SQLクエリ内で頻繁に呼び出されるPL/SQL関数を主な対象とします。システムは関数内部のロジックを分析し、それを直接SQL演算に変換できるかどうかを判断します。例えば、関数内に単純な算術演算や文字列処理のみが含まれている場合、SQLトランスパイラはそれを対応するSQL式に変換します。これにより、コンテキストスイッチングによるパフォーマンス低下を抑えるだけでなく、クエリプランをより簡潔明瞭にし、データベースオプティマイザーがより効率的な実行計画を生成しやすくします。
例
以下のコマンドを実行して、
add_numbersという名前の関数を作成します。obclient> create function add_numbers(a int, b int) returns int 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(cast(1, INT(11, 0)), cast(2, INT(11, 0)))]), filter(nil) values({add_numbers(cast(1, INT(11, 0)), cast(2, INT(11, 0)))})クエリの検証結果を確認します。
obclient> SELECT add_numbers(1, 2) FROM dual; +-------------------+ | add_numbers(1, 2) | +-------------------+ | 3 | +-------------------+SQLトランスパイラの最適化を有効にします。
obclient> 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([column_conv(INT,PS:(11,0),NULL,cast(:0, INT(-1, 0))) + column_conv(INT,PS:(11,0),NULL,cast(:1, INT(-1, 0)))]), filter(nil) values({column_conv(INT,PS:(11,0),NULL,cast(:0, INT(-1, 0))) + column_conv(INT,PS:(11,0),NULL,cast(:1, INT(-1, 0)))})最適化を有効にした後の実行計画の出力は
output([column_conv(INT...) + column_conv(INT...)])に変わります。オプティマイザーの出力は、元のadd_numbers(1, 2)関数呼び出しが直接加算式:0 + :1(ここで :0 と :1 はパラメータのプレースホルダーを表します)に置き換えられたことを明確に示しています。これはまさにSQLトランスパイラが機能する核心的な表現です。最適化後のクエリ結果を検証します。
obclient> SELECT add_numbers(1, 2) FROM dual; +------------------+ | ADD_NUMBERS(1,2) | +------------------+ | 3 | +------------------+