Печать
Категория: Вопросы и ответы Oracle
Просмотров: 34966

С помощью команды 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