1e3a5f4d

Пополнение основной линии планов путем оценки планов


По результату выполненых действий в основной линии планов для нашего запроса оказалось два плана: с учетом индекса (признак ACCEPTED = 'NO') и без учета (признак ACCEPTED = 'YES'):

SQL> CONNECT / AS SYSDBA SQL> @baseline :sqlhandle

PLAN_NAME SQL_TEXT ENABLED ACCEPTED ------------------------------ --------------- ---------- ---------- SYS_SQL_PLAN_38c100c08916fd8c SELECT job FROM YES NO

emp WHERE enam e = 'MILLER'

SYS_SQL_PLAN_38c100c0d8a279cc SELECT job FROM YES YES

emp WHERE enam e = 'MILLER'

Можно выдать оптимизатору задание проверить с планы признаками ACCEPTED = 'NO' (то есть учтеные в SMB, но не причисленые к приемлемым) на эффективность и включить их в основную линию (пометить как «приемлемые»), если они окажутся не хуже ранее там имевшихся:

BEGIN SELECT DISTINCT sql_handle INTO :sqlhandle FROM dba_sql_plan_baselines WHERE DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE ( :sqltext ) = signature; END; / EXECUTE :report := - DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE ( sql_handle => :sqlhandle )

Первую проверку изменений в SMB выполним по признаку ACCEPTED в справочной таблице:

SQL> @baseline :sqlhandle

PLAN_NAME SQL_TEXT ENABLED ACCEPTED ------------------------------ --------------- ---------- ---------- SYS_SQL_PLAN_38c100c08916fd8c SELECT job FROM YES YES

emp WHERE enam e = 'MILLER'

SYS_SQL_PLAN_38c100c0d8a279cc SELECT job FROM YES YES emp WHERE enam e = 'MILLER'

Вторую проверку выполним по содержимому переменной REPORT, составленному функцией EVOLVE_SQL_PLAN_BASELINE:

SQL> SET LONG 10000 SQL> SELECT :report "Baseline evolution results:" FROM dual;

Baseline evolution results: --------------------------------------------------------------------- --------------------------------------------------------------------- Evolve SQL Plan Baseline Report ---------------------------------------------------------------------

Inputs: ------- SQL_HANDLE = SYS_SQL_dd7adbcd38c100c0

PLAN_NAME = TIME_LIMIT = DBMS_SPM.AUTO_LIMIT VERIFY = YES COMMIT = YES


Plan: SYS_SQL_PLAN_38c100c08916fd8c

----------------------------------- Plan was verified: Time used .06 seconds. Passed performance criterion: Compound improvement ratio >= 1.5. Plan was changed to an accepted plan.

Baseline Plan Test Plan Improv. Ratio

------------- --------- ------------- Execution Status: COMPLETE COMPLETE Rows Processed: 1 1 Elapsed Time(ms): 0 0 CPU Time(ms): 0 0 Buffer Gets: 3 2 1.5

Disk Reads: 0 0 Direct Writes: 0 0 Fetches: 0 0 Executions: 1 1

--------------------------------------------------------------------- Report Summary --------------------------------------------------------------------- Number of SQL plan baselines verified: 1. Number of SQL plan baselines evolved: 1.

Вердикт о влючении плана в основную линию производится на основании сравнения взвешенных суммарных оценок поперечисленным в отчете показателям («Compound improvement ratio»; точное правило не оглашается). В нашем случае он оказался благоприятным для плана-кандидата (коэффициент улучшения эффективности >= 1.5).

Теперь можно проверить прежним манером, как появление второго плана в основной линии отразилось на отработке запроса, выдав последовательность:

CONNECT scott/tiger SELECT job FROM emp WHERE ename = 'MILLER'; @showplan ALTER SESSION SET optimizer_use_sql_plan_baselines = FALSE; SELECT job FROM emp WHERE ename = 'MILLER'; @showplan

На этот раз планы окажутся одинаковыми, «новыми» (INDEX RANGE SCAN → TABLE ACCESS BY INDEX ROWID).


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