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



             

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


WITHOUT_PLUS   2      ORDERED

WITHOUT_PLUS   3      NO_FACT(T1)

WITHOUT_PLUS   4      INDEX(T1 INDX_T1)

WITHOUT_PLUS   5      NOREWRITE

WITHOUT_PLUS   6      NOREWRITE

13 строк выбрано.

В вышеупомянутых русскоязычных источниках, описываются несколько приемов "обмана" CBO (Cost Based Optimizer), прибегнув к которым мы "заставим" CBO строить нужный нам план. В этой статье я предложу вам еще один подобный прием.

Всё достаточно просто. Что нам нужно? Нам нужно чтобы при выполнении запроса с "хинтом" оптимизатор использовал подсказки из запроса с "отключенным хинтом". Итак, мы просто подменяем подсказки. Делаем это путем изменения имен хранимых шаблонов:

SQL> update outln.ol$

  2  set ol_name = 'RIGHT_PLAN'

  3  where ol_name = 'WITH_PLUS';

1 строка обновлена.

SQL> update outln.ol$hints

  2  set ol_name = 'RIGHT_PLAN'

  3  where ol_name = 'WITHOUT_PLUS';

6 строк обновлено.

SQL>

SQL> update outln.ol$hints

  2  set ol_name = 'WITHOUT_PLUS'

  3  where ol_name = 'WITH_PLUS';

7 строк обновлено.

Ставший ненужным шаблон WITHOUT_PLUS - удаляем (фиксация предыдущих изменений нам не потребуется, т.к. SQL выражение DROP относится к числу изменяющих словарь данных Oracle (Data Definition Language, DDL), что вызывает неявную фиксацию предыдущей транзакции):

SQL> drop outline WITHOUT_PLUS;

Вариант удален.

Вот собственно и всё. Теперь можно проверить наш "проблемный" запрос. Для чистоты эксперимента, посмотрим еще раз на план нашего "проблемного" запроса:

SQL> set autotrace on explain

SQL> select /*+ rule*/ *

  2  from t1

  3  where itemid = :itemid;

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

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

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




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