@WIKI
再帰的SQL
最終更新:
Bot(ページ名リンク)
-
view
「RECURSIVE」および「NON-RECURSIVE」の違いについて、
再帰的コール(RECURSIVE CALL)とは:
ユーザが発行した[[SQL文]]を実行するために、[[Oracle]]は追加の文を発行しなければ ならないことがあります。このような文を再帰的コールまたは再帰的SQL文とい います。たとえば、十分な領域のない表に行を挿入しようとすると、Oracleは 再帰的コールを実行して動的に領域を割り当てます。[[SQLトレース]]機能が使用可能 になっているときに、再帰的コールが発生すると、TKPROFは再帰的コールの原因 となった文に加えて再帰的SQL文の統計を表示します。
再帰的コールの見分け方:
TKPROFで出力されているSQL文が再帰的SQL文かそうでないかは、各SQL文の最後 の「recursive depth」情報で判断します。この値が1以上の場合、そのSQL文は 再帰的SQL文としての統計情報となります。
再帰的SQL文でない場合
******************************************************************************** select * from emp call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.00 1 0 1 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 2 0.00 0.00 1 2 4 14 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 4 0.00 0.00 2 2 5 14 Misses in library cache during parse: 1 Optimizer goal: CHOOSE Parsing user id: 48 <<- ※何も出力されていません ********************************************************************************
再帰的SQL文の場合
******************************************************************************** select con#,obj#,rcon#,enabled,nvl(defer,0) from cdef$ where robj#=:1 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.00 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 1 0.00 0.00 0 1 0 0 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 3 0.00 0.00 0 1 0 0 Misses in library cache during parse: 1 Optimizer goal: CHOOSE Parsing user id: SYS (recursive depth: 1) <<- ※再帰的SQL文です ********************************************************************************
「recursive depth」(以下、DEPTH)は、SQL 文が発行された再帰レベルを示します。
たとえば、値 0 はユーザーがその文を発行したことを示します。値 1 は、Oracleが 値 0 の文(ユーザー発行の文)を処理する再帰的コールとして、その文を生成した ことを示します。値n は、Oracle がその文を値 n-1 の文を処理する再帰的コールと して生成したことを示します。
注意:内部表に対する処理だけが再帰的SQL文となるわけではありません。
PL/SQLブロックでストアド・プログラム(パッケージ、プロシージャ、ファンクションなど)を呼ぶ処理を行った場合、
ストアド・プログラムの中で実行されるSQL文はSELECTやUPDATEであっても再帰的SQL文とみなされ、再帰的SQL文
の統計情報として出力されます。
PL/SQLブロックでストアド・プログラム(パッケージ、プロシージャ、ファンクションなど)を呼ぶ処理を行った場合、
ストアド・プログラムの中で実行されるSQL文はSELECTやUPDATEであっても再帰的SQL文とみなされ、再帰的SQL文
の統計情報として出力されます。
全体の統計情報について:
全体の処理にかかった統計情報は、トレース・ファイルの最後に出力されている
全体の処理にかかった統計情報は、トレース・ファイルの最後に出力されている
OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS
という統計情報で確認します。
OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS = 非再帰的SQL文の統計情報の合計 OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS = 再帰的SQL文の統計情報の合計
処理全体にかかった時間は、この両者を合計した時間になります。
(※ SQLトレースを取得する際に初期化パラメータtimed_statisticsをTRUEにしていない場合には処理時間は常に0.00となります。)
(※ SQLトレースを取得する際に初期化パラメータtimed_statisticsをTRUEにしていない場合には処理時間は常に0.00となります。)