четверг, 16 августа 2012 г.

Простая, но эффективная оптимизация запроса

Как оптимизировать запрос? Вариантов много, все зависит от поставленной задачи и самого запроса. Но есть довольно таки, простой, но в то же время достаточно эффективный способ оптимизации, при котором нет необходимости менять условия в запросе, разбирать JOIN и т.п. 
Например, при выполнении данного запроса:





























трассировка SQL (ST05), показала время выполнения  > 20 сек., не очень хорошее время, а если учесть, что этот запрос стоит в цикле, и выбирается около шести тысяч записей при каждом обращении, то все становится совсем грустно...












А теперь о волшебстве: необходимо, порядок следования выбираемых полей внутренних таблиц сделать таким же, как и в таблице словаря. Выглядит это так:


Теперь трассировка показывает совсем другой результат:









Совсем не плохо, учитывая, что мы просто поменяли следование полей внутренней таблицы. 
Исходя из этого конкретного запроса, таблицы участвующие в нем ANLA и ANLZ не буферизируются, а значит можно попробовать применить указания для БД, в миру HINTS, а конкретно HINTS &REPARSE&'. Основное назначение данного указателя формирование оптимального плана выполнения запроса.



Снова запускаем трассировку:








Оптимизация выполнена, без разбора условий запроса, без изменения кода программы.

P.S. 
Актуально для БД Oacle.

1 комментарий:

  1. Вот ещё видео в тему оптимизации кода ABAP программы с примерами, возможно кому-то пригодится: Оптимизация ABAP кода

    ОтветитьУдалить