17 февраля 2011 г.

oracle: План выполнения запроса

Полезно почитать официальную доку по DBMS_XPLAN.
из инета dbms_xplan 

План выполнения запроса

Расшифровка значений плана:

Cost - стоимость, совокупная стоимость строки плана - это время, потраченное на одноблочные чтения, плюс время, потраченное на многоблочные чтения, плюс необходимое процессорное время, и всё это делённое на время, необходимое для выполнения одноблочного чтения.
Таким образом, стоимость - это суммарное прогнозируемое время выполнения оператора, выраженное в единицах времени выполнения одноблочного чтения. 

Card - кардинальность, количество записей, которое будет сгенерировано каждой строкой плана.

Bytes - байт, общий объём данных, который будет сгенерирован каждой строкой плана.


План запроса (общая информация)


1й способ
В схеме учётной записи, выполняющей данную команду, должна быть таблица PLAN_TABLE, которая создаётся скриптом @$ORACLE_HOME/rdbms/admin/utlxplan.sql
SQL> @$ORACLE_HOME/rdbms/admin/utlxplan.sql; 

Чтобы узнать в командной строке по какому плану база будет выполнять запрос:
select * from test_table where name=’test’;

Нужно:
sql> explain plan for select * from test_table where name=’test’;

Посмотреть план:
sql> select * from table(DBMS_XPLAN.DISPLAY);


Так же можно посмотреть план из plan_table с помощью sql запроса.
Только необходимо задать STATEMENT_ID, что бы как то различать планы если их несколько в таблице plan_table:
sql> explain plan set STATEMENT_ID='test_1' for select * from test_table where name=’test’;

-- посмотреть план:
SELECT LPAD(' ', 2 * (level - 1)) ||
       DECODE (level,1,NULL,level-1 || '.' || pt.position || ' ') ||
       INITCAP(pt.operation) ||
       DECODE(pt.options,NULL,'',' (' || INITCAP(pt.options) || ')') plan,
       pt.object_name,
       pt.object_type,
       pt.bytes,
       pt.cost,
       pt.partition_start,
       pt.partition_stop
FROM   plan_table pt
START WITH pt.id = 0
  AND pt.statement_id = 'test_1'
CONNECT BY PRIOR pt.id = pt.parent_id
  AND pt.statement_id = 'test_1';




2й способ (в sqlplus)
Чтобы посмотреть план выполнения из sqlplus нужно установить autotrace

sql> set autotrace on
sql> set autotrace off

Ещё возможны опции установки:

SET AUTOTRACE ON EXPLAIN
The AUTOTRACE report shows only the optimizer execution path.


SET AUTOTRACE ON STATISTICS
The AUTOTRACE report shows only the SQL statement execution statistics.

SET AUTOTRACE TRACEONLY
Similar to SET AUTOTRACE ON, but suppresses the printing of the user’s query output, if any. If STATISTICS is enabled, query data is still fetched, but not printed.


План запроса (дополнительно)


Планы запросов можно вытянуть из V$SQL_PLAN.
V$SQL_PLAN contains the execution plan information for each child cursor loaded in the library cache.


Вытянуть план запроса по его SQL_ID.
SELECT * FROM table(DBMS_XPLAN.DISPLAY_CURSOR('&SQL_ID', 0 ));

-- например
SELECT * FROM table(DBMS_XPLAN.DISPLAY_CURSOR('ck4na28rqh00d', 0 ));

-- нарисует:
SQL_ID  ck4na28rqh00d, child number 0
-------------------------------------
SELECT count(*) FROM TSS_TRANSACTION WHERE entry_dt < TO_DATE('20120830
07:57:08', 'YYYYMMDD hh24:mi:ss')

Plan hash value: 804789899

--------------------------------------------------------------------------------------
| Id  | Operation          | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |                 |       |       |     3 (100)|          |
|   1 |  SORT AGGREGATE    |                 |     1 |     9 |            |          |
|*  2 |   TABLE ACCESS FULL| TSS_TRANSACTION |     1 |     9 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("ENTRY_DT"<TO_DATE(' 2012-08-30 07:57:08', 'syyyy-mm-dd
              hh24:mi:ss'))