Displaying Execution Plans
Submitted by dave on Wed, 11/02/2011 - 12:17
Display Most Recent Plan from PLAN_TABLE
WITH CurrPlan AS (SELECT * FROM PLAN_TABLE WHERE TIMESTAMP=(SELECT MAX(TIMESTAMP) FROM PLAN_TABLE)) select ID, lpad(' ', level-1) || 'ParID='||PARENT_ID || ':'||operation || ' (' || options || ')' "Operation", object_name "Object", CurrPlan.* from CurrPlan start with id = 0 connect by prior id=parent_id;
Display from Cursor Cache
Add a unique comment hint (like QUERYCOMMENT001 below) so we can locate the SQL easily in v$sql.
WITH targetsql AS (SELECT sql_id, child_number, sql_text FROM gv$sql WHERE sql_text LIKE '%QUERYCOMMENT001%' AND sql_text NOT LIKE '%PLAN_QUERY%' AND UPPER (sql_text) NOT LIKE '%XPLAN%') SELECT /* PLAN_QUERY */ ID, LPAD (' ', LEVEL - 1) || 'ParID=' || parent_id || ':' || operation || ' (' || options || ')' "Operation", object_name "Object", sp.*, TargetSQL.* FROM gv$sql_plan sp, targetsql WHERE sp.sql_id = targetsql.sql_id AND sp.child_number = targetsql.child_number START WITH ID = 0 CONNECT BY PRIOR ID = parent_id;
Display with Plan Statistics
Add a unique comment hint (like QUERYCOMMENT001 below) so we can locate the SQL easily in v$sql.
This is similar information as DBMX_XPLAN with ALLSTATS LAST option. More information is given here about query block names and such - this helps if you are trying to issue hints for specific places in your query.
WITH TargetSQL AS (SELECT sql_id, child_number, sql_text FROM gv$sql WHERE sql_text LIKE '%QUERYCOMMENT001%' AND sql_text NOT LIKE '%PLAN_QUERY%' AND UPPER (sql_text) NOT LIKE '%XPLAN%') SELECT /* PLAN_QUERY */ ID, LPAD (' ', LEVEL - 1) || 'ParID=' || parent_id || ':' || operation || ' (' || options || ')' "Operation", OBJECT_OWNER "Owner", OBJECT_NAME, object_alias "Alias", QBLOCK_NAME, LAST_STARTS as Starts, CARDINALITY as EST_ROWS, LAST_OUTPUT_ROWS as ACT_ROWS, TO_CHAR(LAST_ELAPSED_TIME/1000000,'9999.99') as "ElapsedSecs", '|||' as "|||", sp.*, ts.*, sps.* FROM targetsql ts, gv$sql_plan sp, gv$sql_plan_statistics sps WHERE ts.sql_id = sp.sql_id AND ts.child_number = sp.child_number AND sp.sql_id=sps.sql_id (+) AND sp.child_number=sps.child_number (+) AND sp.id = sps.operation_id (+) START WITH SP.ID = 0 CONNECT BY PRIOR SP.ID = SP.parent_id;