Основы оптимизации запросов 1С

queryПрограмма очень медленно работает, невозможно дождаться проведения документа или открытия записи? Счета-фактуры и акты формируются по часу? Непорядок! Не хватает руки мастера 1С. Хорошо если ваш супер программист просто в отпуске, скоро вернётся и исправит ситуацию, но что делать тем компаниях, штатное расписание которых не предполагает наличия программиста? Тут варианта два: либо продолжать мучиться в ожидании проведения каждого документа (честно говоря, совсем не вариант), либо пригласить программиста по 1С со стороны. Чем он может помочь? Прежде всего специалист проведёт анализ программы на предмет правильности написанного кода и запросов, именно оптимизация 1С кода позволяет увеличить быстродействие системы.

Общие правила оптимизации 1С кода

Не нужно переписывать всю программу или пытаться исправить то, что на первый взгляд вам не очень нравится. На самом деле необходимо найти те самые пресловутые 20% неэффективности, которые ведут к столько плачевным результатам. Нужно точно знать, что именно требует оптимизации в 1С.

Что требует оптимизации в обязательном порядке?

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

  1. Большая вложенность подзапросов.

1С сделал очень удобным функционал вложенных подзапросов и их соединения. Поэтому их часто используют нерационально. Они необходимы, если надо сделать поэтапно сложные вычисления, из-за этого частенько можно встретить такие конструкции:

image001

Но тут не учтён тот факт, что оптимизатор сервера, какую бы СУБД вы не применяли, не во всех случаях имеет возможность грамотно оптимизировать указанный вариант запроса. Результатом будет очень низкое быстродействие при его обработке системой. Обратите внимание, загрузка сервера при обработке в пределах нормы. Вывод: коды 1С требуют оптимизации.

Как оптимизировать большую вложенность подзапросов и их соединения?

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

Алгоритм оптимизации:

Ищем самый проблемный запрос ? Получаем текст запроса на встроенном языке 1С ? Дублируем ситуации через функционал Консоли запросов ?Анализируем текст запроса

Вот такие конструкции нужно переписать?

image002

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

image003

Созданную временную таблицу помещаем в основной запрос:

image004

Если нужно выполнить объединение запросов в единый пакетный запрос.

Как оценить результат оптимизации кода 1С?

Проверяем скорость выполнения запроса. Если и сейчас скорость не соответствует желаемой, продолжаем анализ и упрощение.

  1. Выявленные несоответствия между индексами и значимыми условиями запросов.

Если СУБД медленно выполняет запрос возможно, что индексы подходят не ко всем условиям имеющихся в базе данных запросов. Поэтому нужно сопоставить индексы и условия. Условия применяются в следующих секциях:

image005

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

  • Индекс содержит все поля, перечисленные в условии;
  • Эти поля находятся в самом начале индекса;
  • Эти поля идут подряд, т.е. между ними не «вклиниваются» поля, не участвующие в условиях запроса;
  • Запрос не выбирает других полей, кроме тех, которые содержатся в самом индексе. Это требование не является обязательным в том случае, если выбранный индекс является кластерным.
  1. Недопустимое для быстродействие манипулирование параметрами виртуальных таблиц.

Пример неэффективного использования:

image007

Оптимизированный вариант:

image008

  1. Неиспользование «ВЫРАЗИТЬ» при введении полей, имеющих составной тип.

Введение «ВЫРАЗИТЬ» исключает соединение таблиц, это попросту больше не нужно.

image009

  1. Лишние поля через символ «.».

Пример: если сделать запрос так, то при его исполнении создастся лишнее левое соединение с таблицей «Контрагенты».

image010

Нужно переписать вот так:

image011

Для более подробного изучения оптимизации запросов и кода 1С, дополнительно советую скачать и изучить вот это руководство.