Скорость 1С. Как оптимизировать производительность 1С. ч. 2
Ранее в статье Скорость 1С. Как оптимизировать производительность 1С. Мы рассмотрели несколько вариантов, как оптимизировать 1С. Там мы писали, что одно из направлений оптимизации – это выявление и устранение неоптимальных участков конфигурации и оптимизация запросов (что особенно критично при переходе на СУБД Postgree).
Рассмотрим подробнее:
1) Запросы в цикле
Почему плохо: Каждый запрос внутри цикла - это обращение к базе данных, и занимает определенное время на выполнение. Итоговое время выполнения равно времени выполнения одного запроса, умноженное на количество итераций цикла.
Как правильно: Необходимо выполнить один общий запрос данных, и в цикле оперировать полученными данными.
2) Запрос в цикле неявный
При обращении к реквизитам ссылки через точку выполняется такое же обращение к базе данных, как при цикле в п.1. Еще один пример неявных запросов в цикле, когда в цикле вызывается какая-то процедура или функция, внутри которой выполняется запрос.
3) Виртуальные таблицы
При любой возможности необходимо использовать данные виртуальных таблиц, вместо физических. Это значительно ускоряет выполнение запросов к регистрам.
4) Отбор по измерениям
Отбор по измерениям необходимо накладывать в секции параметров виртуальной таблицы, а не в секции ГДЕ, так как при выполнении запроса сначала формируется виртуальная таблица по заданным параметрам, а уже потом выполняется отбор по условиям, указанным в секции ГДЕ.
5) Разыменовывание ссылочных полей составного типа
При разыменовании ссылочных полей составного типа, происходит неявное соединение со всеми таблицами, входящими в составной тип данных, и это усложняет итоговый запрос к базе данных.
Для оптимизации следует выражать необходимый тип из составного при помощи оператора ВЫРАЗИТЬ(), например ВЫРАЗИТЬ(ТоварыНаСкладах.Регистратор КАК Документ.ПриобретениеТоваровУслуг).Номер
6) Соединение с вложенными запросами
Не следует использовать в запросах соединение с вложенными запросами, так как это может привести к замедлению выполнения запроса. При необходимости, следует использовать временные таблицы вместо вложенных запросов.
7) Отсутствие индексов или несоответствующие индексы
При выполнении условий, указанных в запросе (условия в секциях ГДЕ, ИМЕЮЩИЕ, условия соединения таблиц, условия в параметрах виртуальных таблиц) СУБД проверяет наличие подходящих индексов, и если их не находит, выполняет полное сканирование таблицы. Это приводит к увеличению времени выполнения запросов.
Подходящим будет индекс, который:
содержит все поля из условия;
поля из условия идут с начала индекса и подряд (без вхождения полей не участвующих в условии).
Часть индексов 1с создает автоматически, но в некоторых случаях их недостаточно, и необходимо устанавливать дополнительные индексы на реквизиты объектов.
При формировании временных таблиц в запросе так же следует устанавливать индекс на поля, по которым в дальнейшем будут накладываться условия.
Примеры как ставить индексы, из типовой 1С:ERP: