V$SQLからPLAN取得

忘れないようにメモ

--事前に実行するSQLに「/* Mark */」を埋め込んでおく

--文字列の代わりにサイトコードでもある程度可能?

--対象のSQL_TEXTを表示する場合コメント解除してください

SELECT /* myplan */

    sql_plan.id

  , lpad('   ', depth) || operation operation

  , sql_plan.options

  , sql_plan.object_name

  , sql_plan.optimizer

  , sql_plan.cost

 ,  sql_plan.time

  , v_sql.sql_text 

FROM

  v$sql_plan  sql_plan

  inner join ( 

    select

        hash_value

      , address

 , sql_text 

    from

      v$sql v_sqlarea

      --v$sql v_sql

    where

      --絞込みは時間でも埋め込んだTEXTでも可能

      elapsed_time >= 10000000

 --sql_text like '%/* aaa */%'

 and sql_text not like '%myplan%'

  )  v_sql

    on ( 

      sql_plan.hash_value = v_sql.hash_value 

      and sql_plan.address = v_sql.address

    ) 

START WITH

  sql_plan.id = 0 

CONNECT BY

  ( 

    PRIOR sql_plan.id = sql_plan.parent_id 

    AND PRIOR sql_plan.hash_value = sql_plan.hash_value 

    AND PRIOR sql_plan.child_number = sql_plan.child_number

  ) 

ORDER SIBLINGS BY

  sql_plan.id

  , sql_plan.position