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