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

         

Использование основной линии планов запроса оптимизатором CBO


Изменим обстоятельства запуска запроса, индексировав таблицу. План должен поменяться. Однако при включенном (по умолчанию) управлении планами мы этого не увидим. Примечательно, что убедиться в этом удастся только со второй попытки:

SQL> CONNECT scott/tiger Connected. SQL> create index emp_ename on emp ( ename );

Index created.

SQL> SELECT job FROM emp WHERE ename = 'MILLER';

JOB --------- CLERK

SQL> @showplan

PLAN_TABLE_OUTPUT --------------------------------------------------------------------

SQL_ID a7zgruuhu1nkf, child number 3

An uncaught error happened in prepare_sql_statement : ORA-01403: no data found

NOTE: cannot fetch plan for SQL_ID: a7zgruuhu1nkf, CHILD_NUMBER: 3 Please verify value of SQL_ID and CHILD_NUMBER; It could also be that the plan is no longer in cursor cache (check v$sql_plan)

8 rows selected.

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 | ----------------------------------

Первый раз оптимизатор построил новый план, с учетом индекса, но в SMB его не обнаружилось. Тогда оптимизатор занес план в историю и выполнил запрос по единственному в основной линии плану – старому. Со второго раза рабочая область в shared pool оказалась заведена, но запрос по-прежнему был отработан по единственному в основной линии старому плану. Если же управление планами отключить, СУБД отработает по более выгодному в этой версии оптимизатора новому плану:

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: 106684950

------------------------------------------------- | Id | Operation | Name | ------------------------------------------------- | 0 | SELECT STATEMENT | | | 1 | TABLE ACCESS BY INDEX ROWID| EMP | | 2 | INDEX RANGE SCAN | EMP_ENAME | -------------------------------------------------



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