Небольшой кейс оптимизации. Ускоряем печать табеля УПП

15.09.22

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

Будет проведено небольшое расследование производительности без профайлера и трансляторов запроса. Вместо всего этого, ограничимся набором ИР от Tormozit. Дисклеймер: результат не гарантирован, у нашей базы своя специфика, у вас эффект может быть другим.

Скачать файл

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

Наименование SM По подписке [?] Купить один файл
Печатная форма табеля ускоренная
.epf 31,46Kb
2
2
1 SM
Скачать Купить за 1 850 руб.

Итак, начнем с того, что включим Замер производительности из Конфигуратора при печати табеля. Находим узкое место, благо, что оно есть, и ставим там точку остановки.

 

 

 

Запускаем печать табеля ещё раз, попадаем на точку остановки, жмём Shift-F9 (или Меню - Отладка - Вычислить выражение), выполняем команду:

"ВнешниеОбработки.Создать("<Путь к вашему ИР>\ирПортативный.epf", Ложь).От(ЗапросТабель)",

 

 

открываем консоль с запросом. Можно, на всякий случай, сохранить его в файл. В консоли запускаем запрос на выполнение, 

 

 

перейдем на закладку "Запрос результат", нажмем пункт меню "Статистика MSSQL"

 

 

Здесь, возможно, придется ввести данные для доступа к MSSQL. Важно не перепутать, вводим администраторские данные для входа именно в MSSQL, а не 1С

 

 

Мы получим список всех запросов, которые выполнились во время работы нашего суперзапроса. Находим среди них самый тяжелый (например, по столбцу Tot CPU Time) щелкаем на нем, далее Открыть план,

 

 

смотрим на План выполнения запроса и.... ничего интересного я там не нашел, индексы на месте.

Ладно, пойдем другим путем. Смотрим на текст запроса в столбце "Текст запроса мета" и находим этот кусок в главном тексте запроса. В нашем случае, это создание таблицы "ВТГрафикиРаботыПоВидамВремени".

 

 

Глаз сразу цепляется за "Объединить все" в подзапросе. Вспоминаем по многочисленным публикациям, что подзапрос должен быть как можно проще, желательно одна небольшая временная таблица.

ОК, так и сделаем. Создадим на всякий случай копию запроса и уже там заменим объединение двух временных таблиц на одну новую. Можно сделать  это руками, но мы воспользуемся возможностями инструмента "Конструктор запроса ИР".

 

 

Найдем слева нашу таблицу "ВТГрафикиРаботыПоВидамВремени", справа отбор. Провалимся в наш отбор и преобразуем Запрос во временную таблицу 

 

 

Долее, все сохраняем (Ок - Ок), запускаем на исполнение и вуаля, ускорение более, чем в 3 раза в консоли запроса.

 

 

В Замере производительности 

 

 

Внимание, во время манипуляций "Консоль запроса ИР" проставит кучу мусорных условий типа "Истина И". И я не знаю, как их разом убрать.

 

Табель побольше, другая организация

Проверим другой табель. Сначала всё то же самое, узкое место в этой же строке. Пройдя по проторенной дорожке, найдем медленный запрос. Здесь это уже другой запрос, смотрим его план выполнения. 

 


Бросается в глаза большой объем передаваемых данных, полмиллиона записей в небольшом табеле. По аналогии, находим нужное место в тексте запроса, это создание временной таблицы "ВТНеобработанныеПлановыеНачисленияРаботниковОрганизаций".

 

Там мы видим слабый фильтр по огромному регистру ПлановыеНачисленияРаботниковОрганизаций -

"И ПлановыеНачисленияРаботниковОрганизаций.Период <= &КонецПериода".

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

     "И ПлановыеНачисленияРаботниковОрганизаций.Период <= &КонецПериода

     И НЕ(ПлановыеНачисленияРаботниковОрганизаций.ПериодЗавершения < &НачалоПериода

И ПлановыеНачисленияРаботниковОрганизаций.ДействиеЗавершения = ЗНАЧЕНИЕ(Перечисление.ВидыДействияСНачислением.Прекратить))"

Поток данных снизился

 

 

выигрыш составил 4 секунды.

Вау, мы великолепны? Нет, мы ещё не рассмотрели самые большие табели.

 

Самый большой табель.

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

 

 

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

Итак, в начале процедуры "СформироватьМакет" создаем новый Табличный документ

Если Не ПроцедурыУправленияПерсоналомПереопределяемый.РегламентированныйКалендарьЗаполнен(НачалоПериода, КонецПериода, Истина) Тогда
	Если Режим = "Табель" Тогда 
		Возврат;
	КонецЕсли;
КонецЕсли;

ДокументРезультат.Очистить();

///+++
_ДокументРезультат = Новый ТабличныйДокумент;						
ЗаполнитьЗначенияСвойств(_ДокументРезультат, ДокументРезультат);	
///+++
	

Везде, где встречается "ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();" добавляем две строки

Если Не ФормированиеПечатныхФорм.ПроверитьВыводТабличногоДокумента(ДокументРезультат, ОбластьДанныхСтрока) Тогда
	ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
	///+++
	_ДокументРезультат.Вывести(ДокументРезультат);		
	ДокументРезультат.Очистить();
	///+++
	ДокументРезультат.Вывести(ОбластьДанныхКолонтитул);
КонецЕсли;

 

Если Не ФормированиеПечатныхФорм.ПроверитьВыводТабличногоДокумента(ДокументРезультат, ОбластьДанныхПодвал) Тогда
	ПоследняяСтрокаЛиста = ДокументРезультат.ПолучитьОбласть(ДокументРезультат.ВысотаТаблицы - 3,,ДокументРезультат.ВысотаТаблицы,);
	ДокументРезультат.УдалитьОбласть(ДокументРезультат.Область(ДокументРезультат.ВысотаТаблицы - 3,,ДокументРезультат.ВысотаТаблицы,),);
	ДокументРезультат.ВывестиГоризонтальныйРазделительСтраниц();
	///+++
	_ДокументРезультат.Вывести(ДокументРезультат);
	ДокументРезультат.Очистить();
	///+++
	ДокументРезультат.Вывести(ОбластьДанныхКолонтитул);
	ДокументРезультат.Вывести(ПоследняяСтрокаЛиста);
КонецЕсли;

 

Ну и в конце процедуры "СформироватьМакет" тоже добавим несколько строк.

	///+++
	_ДокументРезультат.Вывести(ДокументРезультат);		
	ДокументРезультат.Очистить();
	ДокументРезультат = _ДокументРезультат;				
	///+++
КонецПроцедуры // СформироватьОтчет()

В результате, на табеле в 150 -200 сотрудников ускорение печати в 3 раза,

 

 

на табеле в 400 сотрудников - в 4 раза

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

В качестве иллюстрации и для сравнения с типовой прилагаю модифицированную печатную форму, проверена на УПП 1.3.186.1 и ЗУП КОРП 2.5.175.1.

Оптимизация Ускорение Табель УПП ЗУП2.5 ПечатнаяФорма

См. также

HighLoad оптимизация Программист Платформа 1С v8.3 Бесплатно (free)

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

06.06.2024    7378    Evg-Lylyk    61    

42

HighLoad оптимизация Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

13.03.2024    4323    spyke    28    

48

HighLoad оптимизация Программист Платформа 1С v8.3 Бесплатно (free)

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

13.03.2024    6557    vasilev2015    20    

40

HighLoad оптимизация Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Обработка для простого и удобного анализа настроек, нагрузки и проблем с SQL сервером с упором на использование оного для 1С. Анализ текущих запросов на sql, ожиданий, конвертация запроса в 1С и рекомендации, где может тормозить.

2 стартмани

15.02.2024    10325    208    ZAOSTG    74    

111

HighLoad оптимизация Системный администратор Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Принимать, хранить и анализировать показания счетчиков (метрики) в базе 1С? Почему бы нет? Но это решение быстро привело к проблемам с производительностью при попытках построить какую-то более-менее сложную аналитику. Переход на PostgresSQL только временно решил проблему, т.к. количество записей уже исчислялось десятками миллионов и что-то сложное вычислить на таких объемах за разумное время становилось все сложнее. Кое-что уже практически невозможно. А что будет с производительностью через пару лет - представить страшно. Надо что-то предпринимать! В этой статье поделюсь своим первым опытом применения СУБД Clickhouse от Яндекс. Как работает, что может, как на нее планирую (если планирую) переходить, сравнение скорости работы, оценка производительности через пару лет, пример работы из 1С. Все это приправлено текстами запросов, кодом, алгоритмами выполненных действий и преподнесено вам для ознакомления в этой статье.

1 стартмани

24.01.2024    4491    glassman    17    

40

HighLoad оптимизация Программист Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Встал вопрос: как быстро удалить строки из ТЗ? Рассмотрел пять вариантов реализации этой задачи. Сравнил их друг с другом на разных объёмах данных с разным процентом удаляемых строк. Также сравнил с выгрузкой с отбором по структуре.

09.01.2024    9566    doom2good    49    

70
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. пользователь 15.09.22 10:52
Сообщение было скрыто модератором.
...
2. Steelvan 305 15.09.22 11:27 Сейчас в теме
Коробка оптимизации ?
4. TMV 14 11.10.22 07:19 Сейчас в теме
(2)
Прикрепленные файлы:
3. Painted 49 15.09.22 12:39 Сейчас в теме
(2) Дык, чемодан же, че-мо-дан.
Коробка - это бокс.
TMV; SerVer1C; +2 Ответить
5. tormozit 7194 15.10.22 22:58 Сейчас в теме
"Консоль запроса ИР" проставит кучу мусорных условий типа "Истина И". И я не знаю, как их разом убрать.

У подсистемы есть чат как раз для таких коротких вопросов. Эти фрагменты добавляет "конструктора запроса ИР", а не "Консоль запросов ИР". Поэтому надо в настройках конструктора отключить флажок "Иерархический стиль логических выражений".
Прикрепленные файлы:
6. tormozit 7194 15.10.22 23:04 Сейчас в теме
Локализация тяжелых участков запроса в консоли запросов ИР бегло описана в разделе "Отладка подзапросов" статьи "Отладка логики запроса в консоли запросов ИР" https://infostart.ru/1c/articles/1355985/
Оставьте свое сообщение