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

         

Подготовка к примеру


Далее приводится пример, где в обстоятельства выдачи приложением запроса вносятся изменения в виде добавленного индекса. Положим, мы не очень уверены, как это отразится на обработке запроса. Дабы не просчитаться с непредвиденной потерей эффективности, построим для него основную линию, включающую прежний проверенный план. Таким образом после добавления в БД индекса запрос заведомо не ухудшит производительности, но возможно улучшит.

Для примера подобран нереально простой запрос. Это сделано осознано воимя доходчивости изложения техники.

В примере будут переключения в схемы 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 | ----------------------------------



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