CftClub.ru
Клуб специалистов ЦФТ-Банк

Указания оптимизатору Oracle (RULE)

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
German
Профи


Вступление в Клуб: 25.06.2007
СообщениеСр Июн 20, 2007 19:18   Указания оптимизатору Oracle (RULE) Ответить с цитатой
Полезность: Нет оценки
Стоит ли использовать оптимизацию, основанную на правилах?

В СУДБ Oracle8 реализованы два дохода к оптимизации запросов: подход, основанный на правилах (RULE) и стоимостной подход (COST). Oracle не рекомендует использовать оптимизацию на правилах, не гарантирует, что она будет поддерживаться в последующих версиях СУБД Oracle и советует использовать стоимостную оптимизацию во всех разрабатываемых приложениях.
(см. Oracle8 Tuning Release 8.0 December, 1997 Part No. A58246-01, раздел 8 страница 10)
Выбор подхода к оптимизации задается инициализационным параметром OPTIMIZER_MODE. Для IBSO значение этого параметра соответствует значению по умолчанию - CHOOSE. Фактически это означает, что все SQL-команды SELECT, UPDATE и DELETE образованные после трансляции программного кода PL/Plus, не имеющие явных указаний (hints) оптимизатору, содержат неявное указание CHOOSE, как если бы это было указано явно:
Код:
SELECT /*+ CHOOSE */ id FROM Z#AC_FIN;

Указание CHOOSE позволяет оптимизатору самостоятельно определять подход к оптимизации между подходами на правилах и на стоимости. Если словарь данных Oracle содержит статистику хотя бы для одной из таблиц запроса – используется оптимизация по стоимости в противном случае оптимизация по правилам.
Сбор статистики осуществляется по всем таблицам, соответствующим ключевым Типам словаря данных IBSO и организуется в банках структурами, отвечающие за администрирование Oracle.
Возможно явное задание использования оптимизации на правилах указанием RULE. Использование данного указания приводит к игнорированию других указаний в рамках текущего запроса.
Использование указания RULE не рекомендуется по соображениям, изложенным в первом абзаце.

Как использовать указания оптимизатору в рамках IBSO?

В ISBO допускается использование указаний оптимизатору. Для их установки в операциях словаря данных IBSO используется конструкция pragma hint (см. 1). Для установки указаний оптимизатору в представлениях IBSO используется параметр "Оптимизация" в редакторе представлений (см. 2, раздел 2 – Редактор представлений ТБП).
Подробнее с указаниями оптимизатору и их описанием можно ознакомиться в документации к Oracle (см. 3, раздел 8).

В тексте ответа присутствуют ссылки на:
1) Приложение 1 к описанию модуля "Администратор словаря данных". ("Описание языка Pl/Plus")
2) Глава 6 описания модуля "Администратор словаря данных". ("Представления ТБП")
3) Oracle8 Tuning Release 8.0 December, 1997 Part No. A58246-01

Рекомендуется ли использовать указания оптимизатору в рамках IBSO?

В общем случае в рамках разработки в IBSO рекомендуется избегать использования указаний оптимизатору. Это связано с тем, что, с одной стороны, большинство указаний оптимизатору требуют использования псевдонимов таблиц запроса, а, с другой стороны, существует вероятность изменения алгоритма формирования псевдонимов на этапе трансляции из PL/Plus в SQL в последующих версиях технологического ядра IBSO. Аналогично, при задании индекса в указании оптимизатору не гарантируется, что этот индекс не будет в дальнейшем переименован, удален или изменен другими разработчиками.
Наиболее известным примером необходимости использования указаний оптимизатору является выборка по платежным документам с условиями на дату проводки и состояние (при условии существования в системе раздельных индексов на оба реквизита):
Код:
pragma hint('index(A1 IDX_Z#MAIN_DOCUM_DATE_PROV)');
for d in ::[MAIN_DOCUM]
where
    d%state = 'PROV'
and  d.[DATE_PROV] >= P_DATE
and  d.[DATE_PROV] < P_DATE+1
loop
  null;
end loop;

Данный блок кода является слабым местом, поскольку изменит свое поведение, как в случае изменения индекса, так и в случае изменения алгоритма формирования псевдонимов на этапе трансляции. Необходимость использования указания оптимизатору в данном случае вызвана тем, что оптимизатор выполнения запросов Oracle при разборе условия считает условие по равенству более приоритетным, чем сравнение на больше либо равно или меньше. Однако подавляющее число документов находятся в состоянии "Проведен" (низкая избирательность по колонке "Состояние"), а, следовательно, выборка с использованием индекса по состоянию не даст существенного отличия в производительности относительно полного сканирования таблицы. Использование же индекса по дате проводки значительно сужает число документов, у которых уже останется только проверить состояние (высокая избирательность по колонке "Дата проводки").
Желаемого поведения на этапе выполнения можно достигнуть, внеся незначительные изменения в условие:
Код:
for d in ::[MAIN_DOCUM]
where
    ltrim(d%state) = 'PROV'
and  d.[DATE_PROV] >= P_DATE
and  d.[DATE_PROV] < P_DATE+1
loop
  null;
end loop;


Заключение состояния документа d%state в вызов встроенной SQL-функции ltrim не снижает скорости выполнения запроса, однако, уже не позволяет использовать индекс по состоянию документа. В итоге – оптимизатор использует индекс по дате проводки.
Подробнее с указаниями оптимизатору и их описанием можно ознакомиться в документации к Oracle (см. Oracle8 Tuning Release 8.0 December, 1997 Part No. A58246-01, раздел 8).

По материалам базы знаний сайта сопровождения ЦФТ-Банк http://supportobject.cft.ru/
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru