Рассмотрим пример настройки с помощью пакета DBMS_SQLTUNE конкретного запроса.
Откроем в SQL*Plus сеанс связи с СУБД от имени SCOTT и сделаем необходимые приготовления:
CONNECT scott/tiger
SET AUTOTRACE TRACEONLY EXPLAIN
SELECT ename, loc, sal, hiredate FROM emp, dept WHERE emp.deptno = dept.deptno
;
Ответ на запрос может выглядеть примерно так:
Execution Plan ---------------------------------------------------------- Plan hash value: 615168685
--------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 14 | 532 | 7 (15)| 00:00:01 | |* 1 | HASH JOIN | | 14 | 532 | 7 (15)| 00:00:01 | | 2 | TABLE ACCESS FULL| DEPT | 4 | 84 | 3 (0)| 00:00:01 | | 3 | TABLE ACCESS FULL| EMP | 14 | 238 | 3 (0)| 00:00:01 | ---------------------------------------------------------------------------
Predicate Information (identified by operation id): ---------------------------------------------------
1 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")
Note ----- - dynamic sampling used for this statement
Переключимся на другой сеанс от имени SYS, например так:
HOST sqlplus / AS SYSDBA
Создадим задание на автоматическую настройку запроса со стороны пользователя SCOTT (на углубленный анализ):
DECLARE my_task_name VARCHAR2 ( 30 ); my_sqltext CLOB;
BEGIN my_sqltext := 'SELECT ename, loc, sal, hiredate FROM emp, dept ' 'WHERE emp.deptno = dept.deptno' ;
my_task_name := DBMS_SQLTUNE.CREATE_TUNING_TASK ( sql_text => my_sqltext , user_name => 'SCOTT' , task_name => 'my_sql_tuning_task'
); END; /
Узнать состояние задания можно из словаря-справочника:
SELECT status, execution_start start_time, execution_end end_time FROM dba_advisor_log WHERE owner = 'SYS' AND task_name = 'my_sql_tuning_task' ;
Оно будет 'INITIAL'.
Запустим задание для настройки запроса:
EXECUTE - DBMS_SQLTUNE.EXECUTE_TUNING_TASK ( 'my_sql_tuning_task' );