@WIKI

再帰的SQL

最終更新:

atyou

- 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文
    の統計情報として出力されます。


全体の統計情報について:
 全体の処理にかかった統計情報は、トレース・ファイルの最後に出力されている

     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となります。)
人気記事ランキング
目安箱バナー