1С:Предприятие 8.2 /
Разработчикам /
Прикладные объекты
Использование параметра Условие при обращении к виртуальной таблице
Проблема
Использование сложных конструкций в параметре Условие при обращении к виртуальной таблице приводит к медленной работе запроса.
Пояснение
Виртуальная таблица - это удобная вещь для обращения к данным регистра . Виртуальная таблица скрывает подробности своей работы, предоставляя понятный способ обращения к данным. В частности, виртуальная таблица по-разному формирует запросы к базе данных в зависимости от того, какой режим работы у регистра (включено ли хранение актуальных итогов, рассчитаны ли итоги и на какой последний период). Она может как использовать временные таблицы базы данных, так и сформировать подзапрос.
Параметр Условие предназначен для того, чтобы сократить объем данных , обрабатываемый при работе виртуальной таблицы. Важно понимать, что при использовании временной таблицы никакой оптимизатор СУБД не сможет распознать, что из временной таблицы в последствии будет использована лишь часть данных, а следовательно без правильного указания параметра Условие заполнение временной таблицы ненужными данными часто может быть причиной проблем с производительностью.
С другой стороны, если в параметр Условие заложить слишком много, то такой подход также может принести больше проблем, нежели пользы.
В процессе разбора одной из проблем производительности в конфигурации был обнаружен запрос к виртуальной таблице регистра, при этом в параметре Условие было указано выражение с подзапросом и соединениями двух табличных частей. Более того, из-за использования неявных соединений (использования выражения через точку в выражении языка запросов) количество таблиц в этом выражении выросло еще больше. Это привело к отрицательному результату - вместо увеличения производительности получилось уменьшение скорости работы.
Рекомендация
При обращении к виртуальной таблице следует передавать в условия наиболее простые конструкции, например, "Измерение = Значение". Не рекомендуется использовать подзапросы и соединения(*) в параметрах виртуальной таблицы, так как это приводит к медленной работе запроса.
(*) Примечание. Как явные соединения в подзапросах, так и неявные – при обращении к полям "через точку" от ссылки и соединения, добавляемые из ограничений доступа к данным (RLS), предусмотренных в ролях конфигурации .
Если все же без подзапросов не обойтись, то рекомендуется соблюдать следующие условия:
- в подзапросе только одна таблица, нет соединений с другими таблицами;
- если в подзапросе таблица табличной части (например, Документ.Накладная.СписокТоваров), то не должно быть обращения к реквизитам таблицы-шапки (Накладная.Проведен);
- если в подзапросе таблица, у которой могут быть табличные части (например, Документ.Накладная), то не должно быть обращений к табличным частям (например, ГДЕ Документ.Накладная.СписокТоваров.Номенклатура = "1");
- если в подзапросе временная таблица, то не должно быть условий (раздела ГДЕ);
- если в подзапросе постоянная таблица, то условие (раздел ГДЕ) может бытьдопустимо, только если условие выполняется для 80% (или более) случаев; отсутствие условия означает выполнение для 100% случаев;
- если в подзапросе постоянная таблица, то в ограничениях доступа к данным (RLS) не должно содержатся подзапросов и соединений (допускаются только простые условия вида "ГДЕ Реквизит = Значение", "ГДЕ Истина").
Например, неправильно:
... ИЗ РегистрНакопления.ТоварыКОтгрузке.Остатки(&ДатаОтгрузки,&ОтображениеРаспоряжений И ДокументОтгрузки.Склад = &Склад // неявное соединение «через точку» ИЛИ ДокументОтгрузки В (ВЫБРАТЬ // подзапрос с соединением Распоряжения.Распоряжение КАК ДокументОтгрузки ИЗ Документ.ЗаданиеНаПеревозку.Распоряжения КАК Распоряжения // доступ к этому документу ограничен по сложному RLS, который неявно добавляет еще пару соединений ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаданиеНаПеревозку.СкладыПогрузки КАК СкладыПогрузки ПО Распоряжения.Ссылка = СкладыПогрузки.Ссылка И СкладыПогрузки.Склад = &Склад И Распоряжения.Ссылка.Проведен // здесь и ниже обращения к реквизитам шапки И Распоряжения.Ссылка.Статус В (...)) )
Правильно:
... ИЗ РегистрНакопления.ТоварыКОтгрузке.Остатки( &ДатаОтгрузки, Склад = &Склад // теперь это измерение регистра ИЛИ ДокументОтгрузки В (ВЫБРАТЬ ЗаданияНаПеревозку.Распоряжение ИЗ ВТЗаданияНаПеревозку КАК ЗаданияНаПеревозку)) // выборка из временной таблицы без условий
В случае, если нужно использовать несколько условий с подзапросами следует выбрать одно, удовлетворяющее условиям выше и отфильтровывающее максимальное количество записей. Остальные условия следует накладывать на внешний запрос.
Тренинг-семинар «Как получить работу бухгалтера»
Курсы бухгалтеров с трудоустройством
Курсы программирования 1С:Предприятие 8.2
Другие материалы по теме:
измерение, через точку, условие, доступ, ссылка, таблица, условия, буфер обмена, копировать, раздел, регистр., обмен, использование, накладная, например, остатки, выбрать, количество, конфигурирование, реквизит, работы, пример, значение, регистр, склад, конфигурации, документ
Материалы из раздела: 1С:Предприятие 8.2 / Разработчикам / Прикладные объекты
Другие материалы по теме:
Использование параметра Условие при обращении к виртуальной таблице
Источники данных для расчетов бюджетирования
Устройство и использование режима разделения итогов регистров
Разыменование ссылочных полей составного типа в языке запросов
Нас находят: подзапрос в виртуальной таблице
Мы на Facebook