Скорость 1С. Как оптимизировать производительность 1С. ч. 2

Ранее в статье Скорость 1С. Как оптимизировать производительность 1С. Мы рассмотрели несколько вариантов, как оптимизировать 1С. Там мы писали, что одно из направлений оптимизации – это выявление и устранение неоптимальных участков конфигурации и оптимизация запросов (что особенно критично при переходе на СУБД Postgree).

Рассмотрим подробнее:

1) Запросы в цикле

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

Ранее в статье Скорость 1С. Как оптимизировать производительность 1С. Мы рассмотрели несколько вариантов, как оптимизировать 1С.

Как правильно: Необходимо выполнить один общий запрос данных, и в цикле оперировать полученными данными.

2) Запрос в цикле неявный

При обращении к реквизитам ссылки через точку выполняется такое же обращение к базе данных, как при цикле в п.1. Еще один пример неявных запросов в цикле, когда в цикле вызывается какая-то процедура или функция, внутри которой выполняется запрос.

Ранее в статье Скорость 1С. Как оптимизировать производительность 1С. Мы рассмотрели несколько вариантов, как оптимизировать 1С.-2

3) Виртуальные таблицы

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

Ранее в статье Скорость 1С. Как оптимизировать производительность 1С. Мы рассмотрели несколько вариантов, как оптимизировать 1С.-3

4) Отбор по измерениям

Отбор по измерениям необходимо накладывать в секции параметров виртуальной таблицы, а не в секции ГДЕ, так как при выполнении запроса сначала формируется виртуальная таблица по заданным параметрам, а уже потом выполняется отбор по условиям, указанным в секции ГДЕ.

Ранее в статье Скорость 1С. Как оптимизировать производительность 1С. Мы рассмотрели несколько вариантов, как оптимизировать 1С.-4

5) Разыменовывание ссылочных полей составного типа

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

Для оптимизации следует выражать необходимый тип из составного при помощи оператора ВЫРАЗИТЬ(), например ВЫРАЗИТЬ(ТоварыНаСкладах.Регистратор КАК Документ.ПриобретениеТоваровУслуг).Номер

Ранее в статье Скорость 1С. Как оптимизировать производительность 1С. Мы рассмотрели несколько вариантов, как оптимизировать 1С.-5

6) Соединение с вложенными запросами

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

Ранее в статье Скорость 1С. Как оптимизировать производительность 1С. Мы рассмотрели несколько вариантов, как оптимизировать 1С.-6

7) Отсутствие индексов или несоответствующие индексы

При выполнении условий, указанных в запросе (условия в секциях ГДЕ, ИМЕЮЩИЕ, условия соединения таблиц, условия в параметрах виртуальных таблиц) СУБД проверяет наличие подходящих индексов, и если их не находит, выполняет полное сканирование таблицы. Это приводит к увеличению времени выполнения запросов.

Подходящим будет индекс, который:

содержит все поля из условия;

поля из условия идут с начала индекса и подряд (без вхождения полей не участвующих в условии).

Часть индексов 1с создает автоматически, но в некоторых случаях их недостаточно, и необходимо устанавливать дополнительные индексы на реквизиты объектов.

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

Примеры как ставить индексы, из типовой 1С:ERP:

Ранее в статье Скорость 1С. Как оптимизировать производительность 1С. Мы рассмотрели несколько вариантов, как оптимизировать 1С.-7
Ранее в статье Скорость 1С. Как оптимизировать производительность 1С. Мы рассмотрели несколько вариантов, как оптимизировать 1С.-8