Базы данных Oracle - статьи

         

Трассировка операторов


Утилита SQL*Plus позволяет автоматически получать отчет о способе выполнения оператора, выбранном оптимизатором SQL, а также статистическую информацию о выполнении. Этот отчет выдается после успешного выполнения операторов SELECT, INSERT, UPDATE и DELETE. Такой отчет полезен для контроля и настройки производительности этих операторов.

Для управления данным отчетом используется команда SET AUTOTRACE. Эта команда имеет пять опций:

OFFОтчет не выдается. Это стандартный режим работы SQL*Plus.
ON EXPLAINВыдается только выбранный оптимизатором план выполнения оператора.
ON STATISTICSВыдается только статистическая информация о выполнении оператора.
ONВыдается план выполнения запроса и статистическая информация о выполнении оператора.
TRACEONLYВыдается отчет о статистике, но не выдаются результаты выполнения оператора. Используется для трассировки запросов, возвращающих большие объемы данных.

Для использования этой возможности SQL*Plus необходимо создать в схеме пользователя таблицу PLAN_TABLE и получить роль PLUSTRACE (предоставить ее может только DBA). Выполним следующие действия:

SQL> set autotrace on

SP2-0613: Невозможно проверить формат или существование PLAN_TABLE SP2-0611: Ошибка разблокирования EXPLAIN report SP2-0618: Невозможно найти Идентификатор Сеанса. Проверьте, разрешена ли роль PLUSTRACE SP2-0611: Ошибка разблокирования STATISTICS report

Как видите, по умолчанию эта возможность не поддерживается. Создадим таблицу с помощью сценария $ORACLE_HOME/rdbs/admin/utlxplan.sql:

SQL> @g:\oracle\ora81\rdbms\admin\utlxplan

Таблица создана.

Затем создадим роль PLUSTRACE, дадим ей необходимые привилегии, а затем предоставим ее роли DBA (с помощью сценария $ORACLE_HOME/sqlplus/admin/plustrce.sql):

SQL> connect system/manager as sysdba

Соединено. SQL> @g:\oracle\ora81\sqlplus\admin\plustrce

SQL> SQL> drop role plustrace;

drop role plustrace * ошибка в строке 1: ORA-01919: роль 'PLUSTRACE' не существует



SQL> create role plustrace;


Роль создана.

SQL> SQL> grant select on v_$sesstat to plustrace;

Привилегии предоставлены.

SQL> grant select on v_$statname to plustrace;

Привилегии предоставлены.

SQL> grant select on v_$session to plustrace;

Привилегии предоставлены.

SQL> grant plustrace to dba with admin option;

Привилегии предоставлены.

SQL> set echo off

Теперь предоставим роль PLUSTRACE пользователю, который будет использовать трассировку:

SQL> grant plustrace to scott;

Привилегии предоставлены.

Проверяем, что трассировочный отчет теперь выдается:

SQL> connect scott/tiger

Соединено. SQL> set autotrace on

SQL> set pagesize 25

SQL> select ename, dname, sal

2 from emp, dept

3 where emp.deptno = dept.deptno;

ENAME DNAME SAL ---------- -------------- ---------- SMITH RESEARCH 800 ALLEN SALES 1600 WARD SALES 1250 JONES RESEARCH 2975 MARTIN SALES 1250 BLAKE SALES 2850 CLARK ACCOUNTING 2450 SCOTT RESEARCH 3000 KING ACCOUNTING 5000 TURNER SALES 1500 ADAMS RESEARCH 1100 JAMES SALES 950 FORD RESEARCH 3000 MILLER ACCOUNTING 1300

14 строк выбрано.

План выполнения ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=2 Bytes=88) 1 0 HASH JOIN (Cost=3 Card=2 Bytes=88) 2 1 TABLE ACCESS (FULL) OF 'DEPT' (Cost=1 Card=4 Bytes=44) 3 1 TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=41 Bytes=1353)

Статистика ---------------------------------------------------------- 62 recursive calls 8 db block gets 6 consistent gets 0 physical reads 0 redo size 1267 bytes sent via SQL*Net to client 424 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 2 sorts (memory) 0 sorts (disk) 14 rows processed

Подробнее использование возможностей трассировки в SQL*Plus рассмотрено в отдельном модуле, посвященном настройке производительности.


Содержание раздела