У Документооборота всегда были неважные параметры по производительности, когда в нем работает более 100 сотрудников.
В нашей компании более 800 человек одновременно онлайн, много дочерних организаций и между ними обмен документами. Задача производительности одна из критичных.
При анализе ситуации с ДО 2.1 было выявлено несколько групп "тормозов":
1. Долгая запись документа ДО (входящий, исходящий, внутренний). Причина аналогичная у всех трех объектов. Перед записью проверяет изменились ли права и надо ли перезаписывать. Проверка идет кодом 1С - два цикла. Добавлено, удалено. При небольших объемах прав на объект это "летает". Но при значительных (тысячи и более) запись документа уже может идти минутами. Замена на SQL запрос позволило ускорить процесс до секунд, практически зависимо от количества прав на объект.
2 Пересчет прав. Общий модуль. Тут ситуация сложнее Идет не быстро. Добавление индексов в типовой запрос ситуацию улучшили, но!
2.1. Несколько раз в неделю "зависает" пересчет прав на полдня. Так как мешает работе пользователей -процесс снимали или пересчет прав останавливали, но это не выход.
2.2. Сам запрос нашли в скуле, но там временные таблицы, что в них и почему так долго идет, причем не всегда такое с таким же запросом, непонятно с ходу, где копать.
На помощь пришел инструмент мониторинга - 1smonitor. Дождались, когда дойдет до конца, монитор показал весь путь к проблемному вызову, ситуация стала яснее.
Причина - пересчет в режиме "делегирование" - когда пересчитывается огромная таблица всех прав по делегированию.
Типовой запрос - два вложенных соединения, при чем как всегда связи "перекрестные" - то есть,
1 - связь первой таблицы со второй, по полям первой и второй таблицы
2 - связь третьей таблицы по полю первой + поле из второй
Естественно, SQL не может предсказать ситуацию и использовать подходящий индекс и получает из трех таблиц все строки и вяжет все со всеми.
Так как все три таблицы содержат по десяткам миллионов строк данных - запрос в итоге строился 51 000 сек.
Хорошо подумав, нашел решение, как этот типовой механизм динамического построения запросов переделать.
Вынес первую связку в отдельную временную таблицу с нужными полями для связи.
И потом уже "вязал" временную таблицу с третьей.
В итоге время построения запроса сократилось с 51000 сек до 10 сек.
Плюс так как этот же запрос вызывался при открытии файлов - тоже получилось ускорение.
Ускорение сделано в виде расширения, изменения "обернуты" в "ИзменениеИКонтроль" -поэтому в худшем случае не применяется и ничего не сломают при обновлении релиза.
Подходит под последнюю версию типового ДО 2.1.
Естественно, при применении проверяйте, что нет конфликтов и ошибок применений.
08.07.2024
Добавлено ускорение в фоновое задание "Эскалация задач" - переделан запрос. На наших 21 000 000 задач было порядка 300 сек, стало 6
16.07.2024
Улучшено ускорение в фоновое задание "Эскалация задач" - переделан запрос. На наших 21 000 000 задач было порядка 300 сек, итого стало 0.07 сек
Проверено на следующих конфигурациях и релизах:
- Документооборот КОРП, релизы 2.1.34.1