SQL Plus: Создание и выполнение сценариев - Трассировка операторов SQL*Plus
ОГЛАВЛЕНИЕ
Трассировка операторов SQL*Plus
Утилита 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 рассмотрено в отдельном модуле, посвященном настройке производительности.