Повторный запрос к DBA_ADVISOR_LOG даст STATUS = 'COMPLETED'. ( Для серьезных запросов задание могло бы выполняться намного дольше).
Задание выполнило углубленный анализ с применением контрольных прогонов фрагментов плана и подготовило рекомендации. Запросим их:
SET LONG 10000 SET LONGCHUNKSIZE 1000 SET LINESIZE 200
SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK ( 'my_sql_tuning_task' ) FROM dual;
Получим примерно .
Оптимизатор сделал два наблюдения: (а) отсутствует статистика по одной из таблиц (и предложил готовую команду сбора статистики) и (б) можно получить более выгодный план, применив профиль (и указал для сравнения старый план и план с применением профиля).
Ту же информацию можно извлечь из словаря-справочника, например:
SELECT type, message FROM dba_advisor_findings WHERE owner = 'SYS' AND task_name = 'my_sql_tuning_task' ;
Применим созданый профиль к запросу, правда чуть в иной форме, нежели чем рекомендует оптимизатор, но по сути так же:
BEGIN DBMS_SQLTUNE.ACCEPT_SQL_PROFILE ( task_name => 'my_sql_tuning_task' , name => 'my_sql_profile'
); END; /
Уточнить свойства (и наличие) созданного профиля запроса можно по словарю-справочнику так:
SELECT category, type, status FROM dba_sql_profiles WHERE name = 'my_sql_profile' ;
Вернемся в исходный сеанс, снова выдадим запрос и понаблюдаем план:
EXIT /
Получим примерно такой результат:
Execution Plan ---------------------------------------------------------- Plan hash value: 351108634
Predicate Information (identified by operation id): ---------------------------------------------------
4 - access("EMP"."DEPTNO"="DEPT"."DEPTNO")
Note ----- - SQL profile "my_sql_profile" used for this statement
Тем не менее опыт показывает, что несовпадение текстов ограничивается терпимостью к различиям в регистре букв и количествах пробелов. Например, следующий вид запроса не вызовет подключения профиля:
select ename, LOC,SAL, hiredate from emp, scott.dept WHERE emp.deptno = dept.deptno ;
Хотя профиль и приписан запросу, отдельный сеанс может отказаться от его использования. Профиль был создан для "категории" (поле CATEGORY.DBA_SQL_PROFILES) DEFAULT и будет применен только при условии, что запрос выдается с установленым в DEFAULT значением параметра СУБД SQLTUNE_CATEGORY. Это значение умолчательное. Заменим его на другое:
ALTER SESSION SET SQLTUNE_CATEGORY = test;
SELECT ename, loc, sal, hiredate FROM emp, dept WHERE emp.deptno = dept.deptno;
План для этого (и только !) сеанса снова станет прежним: Execution Plan ---------------------------------------------------------- Plan hash value: 615168685