С помощью команды EXPLAIN PLAN и пакета dbms_xplan, можно посмотреть, как будет выглядеть будущий план SQL запроса:
EXPLAIN PLAN FOR SELECT * FROM scott.emp e, scott.dept d WHERE e.deptno = d.deptno AND e.ename='benoit'; SELECT * FROM TABLE (dbms_xplan.display)
Если SQL курсор запроса уже присутствует в разделяемой области SQL, то его план выполнения можно получить с помощью процедуры display_cursor пакета dbms_xplan:
SELECT * FROM TABLE (dbms_xplan.display_cursor('fr0nvkcv4v70f'));
Значение параметра sql_id которое нужно подставлять в качестве входного, можно взять из представлений v$sqlarea и v$session. К примеру, следующий запрос выводит план текущего выполняемого курсора для определённого сеанса:
SELECT b.* FROM v$session a, TABLE(dbms_xplan.display_cursor(a.sql_id)) b WHERE a.sid = 1474;
Бывают ситуации, когда надо посмотреть план курсора SQL запроса, но в разделяемой области SQL такого курсора уже нет. Тогда можно использовать процедуру display_awr пакета dbms_xplan для того что бы отобразить этот план из AWR репозитория:
SELECT * FROM table(DBMS_XPLAN.DISPLAY_AWR(' 8zg2ht5n1jbjt'));
Получить sql_id нужного курсора в этом случае можно с помощью представления dba_hist_sqltext:
SELECT sql_id, sql_text FROM dba_hist_sqltext WHERE sql_text LIKE '%scott%'
Возможность просматривать планы SQL курсоров появилась в Oracle только в версии 10.1. Сам пакет dbms_xplan существует в Oracle, начиная с версии 9.2. Для того чтобы посмотреть план выполнения запроса в более ранних версиях Oracle, надо использовать запрос к таблице plan_table, как например, в следующем коде SQL:
DELETE FROM plan_table WHERE statement_id = 'P1'; EXPLAIN PLAN SET STATEMENT_ID = 'P1' FOR SELECT * FROM scott.emp e, scott.dept d WHERE e.deptno = d.deptno AND e.ename='benoit'; / SELECT id || ' ' || parent_id || ' ' || LPAD(' ',2 * ( LEVEL - 1 )) || operation || DECODE(other_tag,NULL,'','*') || DECODE(options, NULL, '', ' (' || options || ')') || DECODE(object_name, NULL, '', ' OF ' || object_name || '') || DECODE(object_type, NULL, '', ' (' || object_type || ')')|| DECODE(id, 0, DECODE(optimizer, NULL, '' , ' Optimizer=' || optimizer)) || DECODE(cost, NULL, '', ' (Cost=' || cost || DECODE(cardinality, NULL, '', ' Card=' || cardinality) || DECODE(bytes, NULL, '', ' Bytes=' || bytes) || ')') FROM plan_table START WITH id=0 AND statement_id = 'P1' CONNECT BY PRIOR id=parent_id AND statement_id = 'P1' ORDER BY id, position