Вот случай, достойный памяти и занесения в литературу!
Плиний Младший, Панегирик императору Траяну
Сейчас для интересующего нас запроса СУБД завела рабочую память в общей области курсоров в shared pool. Загрузим оттуда план (первый по счету) в основную линию в базе управления запросами SMB, сославшись на идентификатор курсора SQL ID:
CONNECT / AS SYSDBA EXECUTE :sqltext := q'[SELECT job FROM emp WHERE ename = 'MILLER']' EXECUTE – SELECT sql_id INTO :sqlid FROM v$sqlarea WHERE sql_text = :sqltext EXECUTE :retcode := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE ( :sqlid )
Проверка:
SQL> SELECT :retcode "Plans selected:" FROM dual;
Plans selected: --------------- 1
Для простоты последующих обращений к таблице DBA_SQL_PLAN_BASELINES за сведениями о SMB запомним в файле еще один рабочий запрос. Он параметризован ключом прикладного запроса, который узнаем по тексту запроса и поместим в переменную SQLHANDLE:
COLUMN sql_text FORMAT A15 WRAP COLUMN enabled FORMAT A10 COLUMN accepted FORMAT A10 SELECT plan_name, sql_text, enabled, accepted FROM dba_sql_plan_baselines WHERE sql_handle = &1 . SAVE baseline REPLACE SET VERIFY OFF
BEGIN SELECT DISTINCT sql_handle INTO :sqlhandle
FROM dba_sql_plan_baselines WHERE DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE ( :sqltext ) = signature; END; /
Проверка:
SQL> PRINT sqlhandle
SQLHANDLE -------------------------------- SYS_SQL_dd7adbcd38c100c0
SQL> @baseline :sqlhandle
PLAN_NAME SQL_TEXT ENABLED ACCEPTED ------------------------------ --------------- ---------- ---------- SYS_SQL_PLAN_38c100c0d8a279cc SELECT job FROM YES YES
emp WHERE enam e = 'MILLER'
Несмотря на то, что в нашем случае запрос попал в SMB по ссылке на SQL ID, в самой базе он идентифицируется ключом SQL_HANDLE, который автоматически порождается по подписи запроса, в свою очередь вычисляемой по нормализованому тексту. Это позволяет хранить план в AWR долговременно, независимо от того, представлен ли запрос вообще в курсорной области в данный момент, и под каким именно SQL ID представлен.
Обратите внимание, что использованный способ загрузки плана в основную лонию автоматически выставил признаки ENABLED и ACCEPTED в состояние 'YES', то есть единственный пока план в SMB и в рабочем состоянии, и включен в основную линию.