Решение проблемы быстродействия в ERP на рабочем примере

06.04.24

База данных - HighLoad оптимизация

Рассмотрим практический пример оптимизации, определим последовательность действий и воспользуемся специализированными инструментами.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Мониторинг производительности (Анализ технологического журнала) 2.0.9.11
.cf 1 023,49Kb ver:2.0.9.11
434 2 450 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Постановка задачи

Проблема: выполнение операции занимает значительное время под пользователями с ограничениями.

Задача: оптимизировать проблемный участок с минимальными переделками и доработками.

Исходные данные: ERP ~700 онлайн одновременно. Подсистема производство. Точка входа: кнопка «Диспетчирование (ББВ)» в подсистеме производство.

Диспетчирование (ББВ)

Пару слов про работу этой кнопки с технической стороны: По нажатию на эту кнопку на сервере запускается фоновое задание, результат которого ожидается на форме клиента. Фактически ЕРП не висит (выполняется асинхронно), но пользователь ждет результатов выполнения, чтобы приступить к работе.

Замечание: Мы же знаем, что время = деньги! А также что время ожидания еще коррелирует с точкой закипания пользователя ;)

Последовательность решения

Начальный этап.

Определяемся с точкой анализа и определяем порядок действий для выполнения замера.

Замечание: Согласитесь - плохой тон включать ТЖ на все и для всех.

I) Замер с таймером. 

А) Замер с таймером на рабочей базе.

Предварительный анализ показал, что под пользователем с полными правами выполняется в диапазоне от 5-15 сек. Под пользователем с ограничениями выполняется от 50-70 сек.

Б) Замер с таймером на локальной копии.

Под полными правами 3-8 сек. Под пользователем с ограничениями 4-10 сек.

Выводы: проявляется под нагрузкой.

II) Включаем замер технологического журнала (ТЖ).

Для замера используем отбор по сеансу, базе и пользователю, чтобы не анализировать кучу данных ненужных. Подготовка, пользователь открывает подсистему и ждет команды нажать кнопку. В ТЖ обязательно включить следующие условия (данные в зависимости от текущей ситуации):

<eq property="p:processName" value="ERP"/> 
<eq property="usr" value="Пользователь"/> 
<property name="sessionid" value="1234"/>

А) Замеры на рабочей показали следующую картину см. таблица 1. Под полными и правами пользователей с ограничениями.

Б) Делаем замер на копии. Под полными и не полными.

Получаем фактически «квадрат» из таблиц, показывающих как ведет себя система под нагрузкой и без, при учете РЛС и без.

Для выполнения анализа воспользуемся конфигурацией «анализ технологического журнала» ссылки в конце статьи.

Замечание: Мы считаем, что анализ журнала должен быть простым и наглядным, а мериться длиной глубиной знаний в разборе текста на perl или regexp не стоит, можно заняться и более приятным делом, пока необходимый инструмент работает. К примеру, выпить чаю с печенькой)

Табл. 1 Замеры пользователя с ограничениями RLS на нагруженной базе

Табл. 2 Замеры пользователя администратора на нагруженной базе

III) Анализируем, выполняем поиск проблемных участков  

Берем и открываем расшифровку Context для длительной операции согласно рисунку "Табл.1" и смотрим его расшифровку:

 

Технически проблемная часть находится в модуле «ОперативныйУчетПроизводстваВызовСервера» -> функция «ДанныеДляФормированияМаршрутныхЛистов». 

Проблемной частью в нашем случае является выполнение запроса под RLS.  Архитектурные изменения не рассматриваем (минимум изменений), думаем как оптимизировать.

Запрос и представление функции выглядит так.

 

IV) Вырабатываем решение.

Если рассмотреть в сравнении два первых рисунка, то видно, что в привилегированном режиме выполнение запроса минимально (это фактически минимально достижимое время без глобальных исправлений). Поэтому, если вынести весь запрос или его часть в этот особый режим, то время выполнения достигнет приемлемых величин. 

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

  • Накладываем фильтр простыми отборами соответствующими RLS. В качестве примера возьмем реализацию АРМ "Отгрузки" типовой конфигурации. На пользователя наложен RLS по складам на справочник Склады, т.е. он может выбрать только те склады к которым у него есть доступ. Поэтому накладывать ограничения на запросы позволяющие получить таблицу распоряжений не имеет смысла и можно получать результат в привилегированном режиме.
     
  • Накладываем фильтр набором разрешенных данных. Если в запросе с разрешенными можно выделить некоторую изначальную выборку данных, в рамках которой в дальнейшем определяется итоговый результат, то эти данные выберем сначала (используя разрешенные), а на последующий пакет запросов искусственно накладываем фильтр из этого набора (используем внутреннее соединение с временной таблицей, оператор "В"). Т.е. иногда можно разбить запрос с разрешенными на две части - под ограничениями и без (в привилегированном режиме). 

В данном случае было предложено использовать разбиение запроса и реализовать следующим образом:

1. добавить мини запрос, в котором выбрать разрешенные распоряжения по таблице с остатками (фильтр из данных)

2. оставшийся типовой запрос выполнить в привилегированном режиме, но с дополнительной фильтрацией по данным временной таблицы из первого запроса.

На что еще необходимо обратить внимание (Вы это скорее всего прекрасно знаете):

а). Выносить во временные таблицы стоит только фильтрованные данные. Плохим примером было бы вынести вместо таблицы остатков, таблицу документов, а потом ее отфильтровать.

б). Стараться всегда, где можно использовать фильтры и отборы.

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

г). Условия в виртуальных таблицах.

д). "Или" переделывать на объединения (вопрос к знатокам, приходилось ли разбивать на десятки объединений условия по ИЛИ)?

Код запроса и представление функции с изменениями:

 

Замеры после оптимизации показали следующие результаты: 
 - Время для полноправного пользователя стало в районе 3-10 сек ,
 - Пользователь с ограничениями стал работать в интервале 10-15 сек.

На рисунке ниже приведена таблица с замерами, выполненными после оптимизации (все замеры проводились при одинаковых настройках).

Табл. 3 Замеры пользователя с ограничениями RLS после оптимизации

Послесловие ... 

Проект для анализа технологического журнала расположен на GitHub по адресу: https://github.com/Polyplastic/1c-parsing-tech-log 

Скажу сразу - другие готовые инструменты для решения подобных проблем нам не подошли в связи с поставленными перед нами целями и задачами.

Замечание: Для тех, кто не хочет ставить EDT и компилировать, но хочет посмотреть – есть возможность скачать с infostart ссылка внизу.
В общем включайтесь в разработку на EDT и Open Source, и да прибудет с нами сила.

(Об особенностях процесса разработки на EDT я рассказывал тут: Взгляд на практику разработки в EDT из зазеркалья )


Вступайте в нашу телеграмм-группу Инфостарт

нагрузочное тестирование ERP оптимизация быстродействие Тестирование 3.0

См. также

HighLoad оптимизация Программист 1C:ERP Бесплатно (free)

Использование оператора «В» для полей или данных составного типа (например, Регистратор) может приводить к неочевидным проблемам.

10.11.2025    5263    ivanov660    48    

51

HighLoad оптимизация Программист 1С:Предприятие 8 1C:ERP Бесплатно (free)

Приведем примеры использования различных в динамических списках и посмотрим, почему это плохо.

18.02.2025    8109    ivanov660    39    

61

HighLoad оптимизация Технологический журнал Системный администратор Программист Бесплатно (free)

Обсудим поиск и разбор причин длительных серверных вызовов CALL, SCALL.

24.06.2024    10535    ivanov660    13    

64

HighLoad оптимизация Программист 1С:Предприятие 8 Бесплатно (free)

Метод очень медленно работает, когда параметр приемник содержит намного меньше свойств, чем источник.

06.06.2024    16505    Evg-Lylyk    73    

46

HighLoad оптимизация Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Анализ простого плана запроса. Оптимизация нагрузки на ЦП сервера СУБД используя типовые индексы.

13.03.2024    8108    spyke    29    

54

HighLoad оптимизация Программист 1С:Предприятие 8 Бесплатно (free)

Оказывается, в типовых конфигурациях 1С есть, что улучшить!

13.03.2024    11435    vasilev2015    22    

47
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. e][tend 18.12.18 10:10 Сейчас в теме
За конфигурацию по разбору логов ТЖ спасибо!
ivanov660; shard; +2 Ответить
2. ivanov660 4900 18.12.18 10:20 Сейчас в теме
(1)
1. Спасибо всем нам) Буду рад если пригодится в работе. По вопросам и замечаниям, если будут пишите в секцию issue на GitHub проекта.
2. В ближайшем будущем мы планируем добавить еще некоторое количество полезного функционала.
3. Сейчас данная конфигурация у нас успешно работает в облаке для мониторинга проблемных ситуаций.
3. mpeg1989 133 18.12.18 11:47 Сейчас в теме
ИЛИ будет отрабатывать медленно, если отбор накладывается на разные поля. Пример:
Контрагент = &Контрагент ИЛИ Номенклатура = &Номенклатура.
Конструкция Контрагент = &Контрагент1 ИЛИ Контрагент = &Контрагент2 будет работать быстро.

Вложенные запросы сами по себе не страшны, плохо СОЕДИНЕНИЕ с вложенным запросом.

Соединение с виртуальной таблицей на уровне СУБД превращается в двойное соединение со вложенным запросом.

Индексирование не всегда полезно, даже если этому учат при экзамене по платформе. Тут дело в том, что на создание индекса тоже расходуется время. Тут надо экспериментальным путем подбирать. Иногда запрос тупил в два раза больше при накладывании индекса на временную таблицу.

А в целом да - РЛС убирать, и отборы, отборы и еще раз отборы!
Dimkasan; tulakin_s; ProgrammistC; A_Max; +4 Ответить
4. ivanov660 4900 18.12.18 12:08 Сейчас в теме
(3) На счет индексирования. Недавно столкнулись с плавающим багом.

Относительно простой запрос по выборке выполнялся практически всегда быстро, но очень редко чертовски медленно - разница оказывалась порядка 100 раз. Смотрели сервер, потом планы запросов и выяснили, что их два: один хороший и оптимальный, а второй дурной со сканом. Так вот проблема была в том, что скуль иногда ошибался. Проблема решилась индексированием маленькой (в большинстве 40-50 записей) временной таблицы.
Поэтому в большинстве случаев настройки решение зависит от конкретной ситуации и окружения для рассматриваемой системы.
12. Silenser 617 26.12.19 09:02 Сейчас в теме
(4)

Относительно простой запрос по выборке выполнялся практически всегда быстро, но очень редко чертовски медленно - разница оказывала
Такое поведение больше похоже на кривую статистику, обновление которой происходит при реиндексации. В следующий раз, попробуйте обновить статистику индексов с фулсканом, возможно, поможет.
13. ivanov660 4900 26.12.19 09:49 Сейчас в теме
(12)Да, проблемы были связаны со статистикой, а также своеобразным взаимодействием версии 1с и SQL. Перестройка статистики в этом случае не помогла.
8. ProgrammistC 61 18.04.19 13:31 Сейчас в теме
(3)
таблицу.
абсолютно согласен с комментарием
5. Darklight 37 19.12.18 17:09 Сейчас в теме
Проект на git-hub не содержит значимых файлов сорсов (одни md). Или я что-то не понимаю.

А вот статья получилась очень познавательная, более менее хорошо написанная! Побольше бы таких статей! Так держать!
6. ivanov660 4900 20.12.18 07:08 Сейчас в теме
(5)это проект EDT и все необходимые файлы на месте.
Чтобы запустить вам нужен EDT и 1С.
Далее в хелпе нужно найти статью как подключиться к git и развернуть проект.
7. Darklight 37 20.12.18 14:29 Сейчас в теме
(6)Это всё понятно. Я извиняюсь, всё нашёл - просто криво в начале посмотрел
9. Alv_prog 11.12.19 17:33 Сейчас в теме
10. bugagashenka 205 23.12.19 06:04 Сейчас в теме
Не подскажете, чем в конфигурации парсите? Я так понимаю, скриптом?
11. ivanov660 4900 23.12.19 08:26 Сейчас в теме
(10)через com на RegExpr vb
14. mdie 87 04.02.20 17:28 Сейчас в теме
На просторах github'а, а также и на infostart'е встречалась утилита на Java для парсинга ТЖ. Подозреваю будет много лучше, чем RegExp из VB через COM
15. ivanov660 4900 04.02.20 17:39 Сейчас в теме
(14)
1. На мой взгляд, намного лучше будет, если 1С ники все же сделают нормальный структурированный вывод информации технологического журнала и не придется использовать все эти регулярные выражения.
2. Мы же преследовали цель все в одном флаконе на 1С для задач анализа быстродействия.
18. user925256 23.10.20 08:52 Сейчас в теме
(15)помогите скачать конфигурацию
19. ivanov660 4900 23.10.20 09:29 Сейчас в теме
(18) А в чем собственно проблема? У вас есть два варианта скачать тут (некоторым образом "поддержать" проект) или на GitHub.
20. user925256 23.10.20 10:34 Сейчас в теме
(18) проблемо с том что после скачивание цф или дт файла нет
22. ivanov660 4900 23.10.20 11:53 Сейчас в теме
(20)
1. Включаю телепата. При скачивании с GiutHub проекта, там нет cf (файла конфигурации). Да это действительно так, Вам надо установить EDT и скомпилировать проект.
2. Я уже писал выше. Повторю если вы хотите скачать cf, то воспользуйтесь infostart (файл в приложении и стоит 3 SM) или GitHub (доступны публикуемые релизы тут бесплатно). Красная или синяя таблетка, вот в чем вопрос)
16. mult1c 15.06.20 11:43 Сейчас в теме
Добрый день. В скачанном .cf нет отчетов\АРМ для просмотра - график PM.
17. ivanov660 4900 15.06.20 14:56 Сейчас в теме
(16) это отдельные обработки ищите на сайте проекта https://github.com/Polyplastic/1c-parsing-tech-log, вот тут master/parsing-tech-log-plugins/bin
21. user925256 23.10.20 11:52 Сейчас в теме
половина этих обработок видает ошибку а есть у вас уже гатовая база как в видео можте дать силку на базу, или мне самой надо исправить обработки под себя?
23. ivanov660 4900 23.10.20 11:57 Сейчас в теме
(21)
1. Готовой базы нет. Это не имеет смысла, т.к. окружение у всех свое. И демо базу также делать не вижу смысла.
2. Во-всех видео уроках и статьях я довольно подробно и качественно описал процесс настройки. Смотрите мои статьи на ресурсе infostart, качайте руководство https://infostart.ru/public/1156851/ и сборник всего сразу со ссылками на гитхаб https://github.com/Polyplastic/1c-parsing-tech-log/wiki
24. user925256 23.10.20 12:03 Сейчас в теме
ладно я разберус и попрашу сваих программистов подцепить все обработки в одну базу по моему так будет намного легко и просто и нагладно
25. ryzn 41 05.09.23 08:20 Сейчас в теме
Спасибо!!! Читалка есть, остальное сами...
26. a-grinyuk 06.04.24 18:05 Сейчас в теме
27. ivanov660 4900 06.04.24 22:35 Сейчас в теме
28. a-grinyuk 10.04.24 09:54 Сейчас в теме
(27)
А можно обработки и отчёты получить ? На github вижу, но как их сконвертировать без EDT не знаю. Без них конфигурация имеет мало смысла как я понял.
29. ivanov660 4900 10.04.24 14:59 Сейчас в теме
(28)
1. посмотрите на вкладке релизы (https://github.com/Polyplastic/1c-parsing-tech-log/releases)
или тут https://github.com/Polyplastic/1c-parsing-tech-log/tree/master/parsing-tech-log-plugins/bin
2. без них используется функционал работы с технологическим журналом, т.е. в некоторых случаях этого может быть достаточно
30. adamst 3 22.08.24 11:33 Сейчас в теме
ну просто вынуждают работать на EDT :)
Для отправки сообщения требуется регистрация/авторизация