Экспертный взгляд на оптимизацию производительности на примере исправления и декомпозиции запроса
Еще один интересный пример оптимизации производительности ERP. Описываем решение проблемы подробно по шагам.
- Описание
- Подробнее
Описание
В данной статье мы изложим некоторую примерную последовательность действий по выявлению проблемы производительности и ее поэтапному решению (с картинками и комментариями). Думаю, что будет особенно интересно новичкам, а также тем, кто планирует столкнуться с СУБД Postgres или уже ведет активную работу в этом направлении.
Структура статьи:
- Введение и постановка задачи
- Ищем точку возникновения
- Получаем исполняемый текст запроса
- Подготавливаем исходный запрос в консоли запросов
- Анализируем план исходного запроса
- Оптимизация шаг 1. Исправление очевидной ошибки
- Оптимизация шаг 2. Декомпозиция запроса
- Заключение
Введение и постановка задачи
Для решения этой задачи нам понадобится:
- конфигурация «Мониторинг производительности» — в ней будем оценивать количество событий, точки возникновения, собирать статистику онлайн;
- доступ к целевой конфигурации ERP — в ней будем смотреть проблемный код и получать текущий запрос;
- консоль запросов – моделирование, оптимизацию;
- конвертер текстов SQL в представления 1С – преобразовывать нечитаемое представление в читаемое тестов и планов, создавать графическое представление плана запросов;
- доступ к базе Postgres для проверки некоторых гипотез (опционально).
Те счастливчики, у которых есть конфигурация ERP, УТ, КА с хорошим набором данных смогут повторить эксперимент у себя. На демонстрационной базе прочувствовать всю глубину рассматриваемой проблемы не получится, но посмотреть планы и увидеть результат работы можно попробовать.
Исходная информация:
Проблема проявилась в документе установка цен номенклатуры у известных пользователей (есть ФИО) конфигурации ERP 2.4. Нам предстоит выявить проблему и исправить эту ситуацию.
Что мы будем делать?
Мы найдем точку возникновения проблемы, получим текст запроса и будем отлаживать в консоли запросов, исправляя проблему. Раз, два, три… Поехали!
I) Ищем точку возникновения
Для того чтобы было удобно и просто искать места проблем, мы рекомендуем установить и настроить конфигурацию "Мониторинг производительности". Это удобно cделать на продуктовом и на тестовом сервере. Если вы конечно не приверженец Old-school и любите работать в каком-нибудь парсере руками.
Т.к. у нас это уже настроено, то мы сразу посмотрим картинку из журнала длительных замеров. Поставим фильтр по длительности, пользователю или текстовому вхождению — это зависит от входящей информации по проблеме. В текущем случае будем фильтровать по вхождению «установка цен» в поле "context".

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

Анализируем контекст:
- Это процедура открытия документа "Установка цен номенклатуры". На это нам указывает команда "получить форму";
- Это основная форма документа;
- Проблема формируется запросом. Самая последняя позиция стека содержит команду "Запрос.Выполнить()";
- Этот запрос похоже находится в модуле «УстановкаЦенСервер» — функция «ЗагрузитьТабличнуюЧастьТовары»;
- Этот запрос расположен в строке «3907»;
- Если мы посмотрим еще несколько записей журнала, то можем встретить вторую функцию «ЗагрузитьСтарыеЦеныНоменклатурыПредприятия», они имеют похожую структуру, но она выполняется обычно быстрее.
Давайте глазками посмотрим что это за запрос, как он выглядит и что из себя представляет. Поэтому переходим к следующей части.
II) Получим исполняемый текст запроса
Чтобы получить искомый текст нам необходимо выполнить набор простых действий:
- Открываем конфигурацию;
- В дереве метаданных находим общий модуль «УстановкаЦенСервер» и открываем его;
- Переходим в точку выполнения запроса — это позиция «3907». Для быстрого перехода к позиции нажимаем сочетания «Ctrl»+«G».
- В итоге мы должны оказаться в функции «ЗагрузитьТабличнуюЧастьТовары».

Где-то чуть выше должен находиться нужный нам текст запроса их два, но нам нужен тот что используется для продажи. На первый взгляд, он довольно простой:

