Использование основной линии планов запроса оптимизатором 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 | -------------------------------------------------



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