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

15.09.22

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

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

Скачать исходный код

Наименование Файл Версия Размер
Печатная форма табеля ускоренная
.epf 31,46Kb
2
.epf 31,46Kb 2 Скачать

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

 

 

 

Запускаем печать табеля ещё раз, попадаем на точку остановки, жмём 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 Конфигурации 1cv8 Бесплатно (free)

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

13.03.2024    3586    spyke    28    

47

Быстродействие типовой 1С

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

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

13.03.2024    5544    vasilev2015    19    

38

Анализируем SQL сервер глазами 1С-ника

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

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

1 стартмани

15.02.2024    8300    169    ZAOSTG    74    

101

Удаление строк из таблицы значений различными способами с замером производительности

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

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

09.01.2024    6583    doom2good    48    

65

Опыт оптимизации 1С на PostgreSQL

HighLoad оптимизация Бесплатно (free)

При переводе типовой конфигурации 1C ERP/УТ/КА на PostgreSQL придется вложить ресурсы в доработку и оптимизацию запросов. Расскажем, на что обратить внимание при потерях производительности и какие инструменты/подходы помогут расследовать проблемы после перехода.

20.11.2023    9420    ivanov660    6    

76

ТОП проблем/задач у владельцев КОРП лицензий 1С на основе опыта РКЛ

HighLoad оптимизация Бесплатно (free)

Казалось бы, КОРП-системы должны быть устойчивы, быстры и надёжны. Но, работая в рамках РКЛ, мы видим немного другую картину. Об основных болевых точках КОРП-систем и подходах к их решению пойдет речь в статье.

15.11.2023    5356    a.doroshkevich    20    

72

Начните уже использовать хранилище запросов

HighLoad оптимизация Запросы

Очень немногие из тех, кто занимается поддержкой MS SQL, работают с хранилищем запросов. А ведь хранилище запросов – это очень удобный, мощный и, главное, бесплатный инструмент, позволяющий быстро найти и локализовать проблему производительности и потребления ресурсов запросами. В статье расскажем о том, как использовать хранилище запросов в MS SQL и какие плюсы и минусы у него есть.

11.10.2023    16600    skovpin_sa    14    

101
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. пользователь 15.09.22 10:52
Сообщение было скрыто модератором.
...
2. Steelvan 302 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 7142 15.10.22 22:58 Сейчас в теме
"Консоль запроса ИР" проставит кучу мусорных условий типа "Истина И". И я не знаю, как их разом убрать.

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