8c7f6c03

Что, по вашему, должно делать приложение?


Чтобы заставить сервер Oracle делать то, что нужно нам, необходимо пройти три этапа:

  • Начинаем новый сеанс и повторно выполняем процедуру, потребовав предварительно от сервера Oracle перехватывать каждый поступающий SQL-оператор вместе с информацией о плане его выполнения. Эти "планы" станут нашим первым примером хранимых шаблонов.
  • Создаем более подходящие шаблоны для всех проблемных SQL-операторов и заменяем "плохие" хранимые шаблоны хорошими.
  • Начинаем новый сеанс и требуем от сервера Oracle начать использовать новые хранимые шаблоны вместо обычных методов оптимизации при обработке соответствующих SQL-ператоров. Затем снова выполняем процедуру.
  • Надо завершать текущий и начинать новый сеанс, чтобы гарантировать, что существующие курсоры не остались открытыми в кэше pl/sql. Хранимые шаблоны генерируются и/или применяются только при анализе операторов, так что надо гарантировать, что уже существующие курсоры для аналогичных операторов закрыты.

    Итак, начнем сеанс и выполним следующую команду:

    alter session set create_stored_outlines = demo;

    Затем выполним небольшой анонимный блок, вызывающий процедуру, например:

    declare m_value varchar2(10); begin get_value(1, 1, m_value); end; /

    Теперь прекращаем сбор планов выполнения (иначе несколько следующих SQL-операторов тоже окажутся в таблицах хранимых шаблонов, что усложнит выполнение дальнейших действий).

    alter session set create_stored_outlines = false;

    Для просмотра результатов выполненных действий можно сделать запросы к представлениям, позволяющим получить детальную информацию о шаблонах, автоматически созданных и сохраненных сервером Oracle:

    select name, category, used, sql_text from user_outines where category = 'DEMO';

    NAME CATEGORY USED ------------------------------ ------------------------------ ------- SQL_TEXT --------------------------------------------------------------------- SYS_OUTLINE_020503165427311 DEMO UNUSED SELECT V1 FROM SO_DEMO WHERE N1 = :b1 AND N2 = :b2

    select name, stage, hint from user_outline_hints where name = ' SYS_OUTLINE_020503165427311';



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