Оптимизация запросов

Один из важнейших пунктов в повышении производительности работы 1С предприятия 8.3 – является оптимизация запросов. Этот пункт так же очень важен при сдаче аттестации 1С- Эксперт по технологическим вопросам. Ниже пойдет речь о типичных причинах не оптимальной работы запросов и способах из оптимизации.

Отборы в виртуальной таблице с помощью конструкции ГДЕ

Накладывать фильтры на реквизиты виртуальной таблицы необходимо только через параметры ВТ. Не в коем случае для отбора в виртуальной таблице нельзя использовать конструкцию ГДЕ, это грубейшая ошибка с точки зрения оптимизации. В случае с отбором с помощью ГДЕ по факту система получит ВСЕ записи и только потом отберет нужные записи.

ПРАВИЛЬНО:

ВЫБРАТЬ

ВзаиморасчетыСДепонентамиОрганизацийОстатки.СуммаОстаток

ИЗ

РегистрНакопления.ВзаиморасчетыСДепонентамиОрганизаций.Остатки(

,

Организация = &Организация

И Физлицо = &Физлицо) КАК ВзаиморасчетыСДепонентамиОрганизацийОстатки

НЕПРАВИЛЬНО:

ВЫБРАТЬ

ВзаиморасчетыСДепонентамиОрганизацийОстатки.СуммаОстаток

ИЗ

РегистрНакопления.ВзаиморасчетыСДепонентамиОрганизаций.Остатки(, ) КАК ВзаиморасчетыСДепонентамиОрганизацийОстатки

ГДЕ

ВзаиморасчетыСДепонентамиОрганизацийОстатки.Организация = &Организация

И ВзаиморасчетыСДепонентамиОрганизацийОстатки.Физлицо = &Физлицо

Получение значения поля составного типа через точку

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

Например, крайне не желательно для оптимизации обращаться к полю записи регистра – регистратор. Регистратор имеет составной тип данных, среди которых все возможные типы документов, которые могут писать данные в регистр.

НЕПРАВИЛЬНО:

ВЫБРАТЬ

НаборЗаписей.Регистратор.Дата,

НаборЗаписей.Количество

ИЗ

РегистрНакопления.ТоварыOрганизаций КАК НаборЗаписей

Т.е по факту, вот такой запрос будет обращаться не к одной таблице, а к 22 таблицам базы данных ( у этого регистра 21 тип регистратора).

1С рекомендует экспертам в таком случае для оптимизации пожертвовать размером хранимых данных в пользу производительности или универсальностью кода ради производительности:

ПРАВИЛЬНО:

ВЫБРАТЬ

ВЫБОР

КОГДА ТоварыОрг.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг

ТОГДА ВЫРАЗИТЬ(ТоварыОрг.Регистратор КАК Документ.РеализацияТоваровУслуг).Дата

КОГДА ТоварыОрг.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг

ТОГДА ВЫРАЗИТЬ(ТоварыОрг.Регистратор КАК Документ.ПоступлениеТоваровУслуг).Дата

КОНЕЦ КАК Дата,

ТоварыОрг.Количество

ИЗ

РегистрНакопления.ТоварыОрганизаций КАК ТоварыОрг

Либо, второй вариант – добавление такой информации в реквизит, например, в нашем случае – добавление даты.

ПРАВИЛЬНО:

ВЫБРАТЬ

ТоварыОрганизаций.Дата,

ТоварыОрганизаций.Количество

ИЗ

РегистрНакопления.ТоварыОрганизаций КАК ТоварыОрганизаций

Подзапросы в условии соединения

Для оптимизации недопустимо использовать подзапросы в условиях соединения, это существенно замедляет работу запроса. Желательно в таких случаях использовать ВТ. Для соединения нужно использовать только объекты метаданных и ВТ, предварительно проиндексировав их по полям соединения.

НЕПРАВИЛЬНО:

ВЫБРАТЬ …

ИЗ Документ.РеализацияТоваровУслуг

ЛЕВОЕ СОЕДИНЕНИЕ (

ВЫБРАТЬ ИЗ РегистрСведений.Лимиты

ГДЕ …

СГРУППИРОВАТЬ ПО …

) ПО …

ПРАВИЛЬНО:

ВЫБРАТЬ …

ПОМЕСТИТЬ Лимиты

ИЗ РегистрСведений.Лимиты

ГДЕ …

СГРУППИРОВАТЬ ПО …

ИНДЕКСИРОВАТЬ ПО …;

ВЫБРАТЬ …

ИЗ Документ.РеализацияТоваровУслуг

ЛЕВОЕ СОЕДИНЕНИЕ Лимиты

ПО …;