2008-05-07

Rowsource execution statistics и dbms_xplan.display_cursor

Rowsource execution statistics собирается для запросов в следующих случаях:
  • statistic_level = all (параметр инициализации)
  • /*+ gather_plan_statistics */ в запросе
  • _rowsource_execution_statistics = true (скрытый параметр)
статистику можно посмотреть во вьюхах:
  • v$sql_plan_statistics
  • v$sql_plan_statistics_all (дополнено использованием памяти)
Кроме того статистику можно посмотреть в планах запроса функцей dbms_xplan.display_cursor с параметром формата ALLSTATS LAST (RUNSTATS_LAST для 10.2)

dbms_xplan.display_cursor
Тема dbms_xplan.display_cursor полностью раскрыта тут

На Oracle 10.2.0.1 было проведено мини исследование, в результате которого родился скрипт для получения плана запроса

set echo off
set serveroutput off
set termout off
set feedback off
ALTER SESSION SET statistics_level = ALL;
SELECT * FROM (&1);
set termout on
select *
from table(dbms_xplan.display_cursor( null, null, 'RUNSTATS_LAST'))
/

set serveroutput on
set feedback on


Скрипт можно модифицировать по желанию.

Для запуска скрипта и получения плана пользователь необходимы привелегии на вьюхи: V$SQL_PLAN, V$SESSION, V$SQL_PLAN_STATISTICS_ALL (если указываем не стандарный параметр форматирования).

В источниках описаны следующие параметры форматирования (третий параметр функции):
BASIC показывает только объект и действие

EXPLAINED SQL STATEMENT:
------------------------
SELECT * FROM (select * from dual)

Plan hash value: 397561404

----------------------------------
| Id | Operation | Name |
----------------------------------
| 0 | SELECT STATEMENT | |
| 1 | TABLE ACCESS FULL| DUAL |
----------------------------------

TYPICAL (по умолчанию) - BASIC + информация о кардинальности, байтах, предикатах, стоимости и т.д.


SQL_ID cp68bupvwmutb, child number 0
-------------------------------------
SELECT * FROM (select * from dual)

Plan hash value: 397561404

--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)| |
| 1 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------

ALL - добавляет к TYPICAL снизу табличку
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

1 - SEL$F5BB74E1 / DUAL@SEL$2

Column Projection Information (identified by operation id):
-----------------------------------------------------------

1 - "DUAL"."DUMMY"[VARCHAR2,1]

с информацией об алиасах запросов, блоков, информацией о колонках. Пригодится при простановке хинтов в запросы.
ALLSTATS LAST (не работает в 10.1)
RUNSTATS_LAST - RUNSTATS_TOT (работает в 10.1 и 10.2) выводят информацию о выполнении курсора (последнее или общее). Требует Rowsource execution statistics (см. выше)
Отличаются только наличием колонки READS с информацией о физических чтениях.

IOSTATS (не работает в 10.1)- информация о вводе выводе (READS). Заодно выводит и всю остальную информацию.
select * from table(dbms_xplan.display_cursor( null, null, 'IOSTATS LAST'))
MEMSTATS (не работает в 10.1)- статистика об использовании запросом рабочих областей PGA (тоже можно получить по вьюхе v$slq_workarea)
select * from table(dbms_xplan.display_cursor( null, null, 'MEMSTATS LAST'))
Advanced, Outline - не испытывал, содрано у Льюиса

+NOTE (не работает в 10.1) - секция с примечаниями, например использовался ли при выполнении запроса dynamic_sampling или star_transformation.
select * from table(dbms_xplan.display_cursor( null, null, 'ALL +NOTE'));
+PEEKED_BINDS (не работает в 10.1) - с какими бинд-переменными получен данный план. Работает без Rowsource execution statistics

select * from table(dbms_xplan.display_cursor( null, null, 'ALL +PEEKED_BINDS'));
SQL_ID 0fks8359u5u12, child number 0
-------------------------------------
SELECT * FROM (select * from a where a=:a)

Plan hash value: 2248738933

-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
-------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 3915 (100)|
|* 1 | TABLE ACCESS FULL| A | 49336 | 47M| 3915 (1)| 00:00:47
-------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

1 - SEL$F5BB74E1 / A@SEL$2

Peeked Binds (identified by position):
--------------------------------------

1 - :A (NUMBER): 2

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

1 - filter("A"=:A)

Column Projection Information (identified by operation id):
-----------------------------------------------------------

1 - "A"[NUMBER,22], "A"."PADDING"[VARCHAR2,2000]

Note
-----
- dynamic sampling used for this statement


PS: Как показала практика +PEEKED_BINDS не работает со сбором Rowsouce execution stat. В результатах показывается только информация о бинд переменных.

Комментариев нет: