Базы данных Oracle - статьи



             

Использование хранимых шаблонов - часть 6


   0      SELECT STATEMENT Optimizer=HINT: RULE

   1    0   TABLE ACCESS (FULL) OF 'T1'

Как видим ничего не изменилось, всё тот же FTS. Активируем наш хранимый шаблон:

SQL> alter session set use_stored_outlines=HEALTHY_PLANS;

Сеанс изменен.

И выполним еще раз всё тот же "проблемный" запрос:

 

SQL> select /*+ rule*/ *

  2  from t1

  3  where itemid = :itemid;

строки не выбраны

План выполнения

----------------------------------------------------------

   0      SELECT STATEMENT Optimizer=HINT: RULE (Cost=2 Card=1 Bytes=78)

   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'T1' (Cost=2 Card=1 Bytes=78)

   2    1     INDEX (SKIP SCAN) OF 'INDX_T1' (NON-UNIQUE)

Цель достигнута.

Изменив подобным образом все проблемные запросы и активировав  соответствующую категорию полученных хранимых шаблонов, можно добиться прежней производительности приложения.

"А что же будет, если мы таким образом подменим план, который был сделан на основе совершенно другой таблицы, либо, скажем, удалим индекс таблицы в существующем примере?" - задаст вопрос проникшийся идеей читатель. Ответ прост - CBO выдаст план, так, как будто бы хранимого шаблона и нет вовсе.

Проводя исследования в данном направлении я наблюдал интересный момент. Вот что я сделал. Я удалил индекс в таблице t1. Проверил реакцию CBO, он проигнорировал хранимый шаблон (как я уже говорил). Вновь создал индекс с тем же именем и на те же поля. И вот тут самое интерестное! Т. к. я не пересобирал статистику на таблицу после создания индекса, то выполнение запроса "без плюсика", привело к FTS, а выполнение нашего "проблемного" запроса, показало прекрасный план, взятый CBO из нашего шаблона. Вот такие дела :). Не забывайте собирать статистику!




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