Далее приводится пример, где в обстоятельства выдачи приложением запроса вносятся изменения в виде добавленного индекса. Положим, мы не очень уверены, как это отразится на обработке запроса. Дабы не просчитаться с непредвиденной потерей эффективности, построим для него основную линию, включающую прежний проверенный план. Таким образом после добавления в БД индекса запрос заведомо не ухудшит производительности, но возможно улучшит.
Для примера подобран нереально простой запрос. Это сделано осознано воимя доходчивости изложения техники.
В примере будут переключения в схемы SCOTT и SYS, но предполагается, что работа выполняется в SQL*Plus без выхода из этой программы, что позволит сохранить значения переменных.
Очистим для предотвращения путаницы общую область курсоров в shared pool (технически это необязательно, но упростит здесь обращение к нужным данным в shared pool), заведем рабочие переменные и сбросим ради простоты показа в файл текст для выдачи плана последнего запроса:
CONNECT / AS SYSDBA ALTER SYSTEM FLUSH SHARED_POOL; VARIABLE retcode NUMBER VARIABLE sqltext VARCHAR2 ( 1000 ) VARIABLE sqlhandle VARCHAR2 ( 30 ) VARIABLE sqlid VARCHAR2 ( 13 ) VARIABLE report CLOB SELECT * FROM TABLE ( DBMS_XPLAN.DISPLAY_CURSOR ( format => 'basic' ) ) . SAVE showplan REPLACE
Предполагается, что основная линия запросов изначально пуста. Исходно план запроса не зависит от того, применяет оптимизатор управление планами, или нет:
SQL> CONNECT scott/tiger Connected. SCOTT> SELECT job FROM emp WHERE ename = 'MILLER';
JOB --------- CLERK
SQL> @showplan
PLAN_TABLE_OUTPUT --------------------------------------------------------------------
EXPLAINED SQL STATEMENT: ------------------------ SELECT job FROM emp WHERE ename = 'MILLER'
Plan hash value: 3956160932
---------------------------------- | Id | Operation | Name | ---------------------------------- | 0 | SELECT STATEMENT | | | 1 | TABLE ACCESS FULL| EMP | ----------------------------------
13 rows selected.
SQL> ALTER SESSION SET optimizer_use_sql_plan_baselines = FALSE;
Session altered.
SQL> SELECT job FROM emp WHERE ename = 'MILLER';
JOB --------- CLERK
SQL> @showplan
PLAN_TABLE_OUTPUT --------------------------------------------------------------------
EXPLAINED SQL STATEMENT: ------------------------ SELECT job FROM emp WHERE ename = 'MILLER'
Plan hash value: 3956160932
---------------------------------- | Id | Operation | Name | ---------------------------------- | 0 | SELECT STATEMENT | | | 1 | TABLE ACCESS FULL| EMP | ----------------------------------