При разработке механизмов выборки данных в 1С:Предприятие часто возникают вопросы о том, какой способ написания запроса является наиболее производительным. Давайте вместе проанализируем две распространенные конструкции и выясним, почему одна из них является эталонной, а другая — избыточной и нерациональной.
Рассмотрим два варианта получения данных, которые возвращают идентичный результат:
Вариант 1 (Стандартный):
ВЫБРАТЬ
ЗаказПокупателя.Ссылка КАК ЗаказПокупателяПоОснованию
ИЗ
Документ.ЗаказПокупателя КАК ЗаказПокупателя
ГДЕ
ЗаказПокупателя.ДокументОснование = &Основание
Вариант 2 (Через избыточное соединение):
ВЫБРАТЬ
ЗаказПокупателя.Ссылка КАК ЗаказПокупателяПоОснованию
ИЗ
Документ.ЗаказПокупателя КАК ЗаказПокупателя
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя КАК ЗаказПокупателяДляФильтра
ПО ЗаказПокупателя.ДокументОснование = &Основание
И ЗаказПокупателя.Ссылка = ЗаказПокупателяДляФильтра.Ссылка
Давайте разберем, что происходит на стороне СУБД при выполнении каждого из этих запросов. Вариант 1 является классическим способом фильтрации данных. Современный оптимизатор запросов СУБД (будь то Microsoft SQL Server, PostgreSQL или IBM DB2) настроен на максимально эффективное выполнение инструкций типа SELECT ... WHERE.
Когда вы используете секцию ГДЕ, платформа 1С передает СУБД четкое условие отбора. В этом случае:
ДокументОснование.Index Seek (поиск по индексу), что является максимально быстрым способом получения данных.Table Scan (сканирование таблицы), что является базовым уровнем затрат ресурсов.Вариант 2 добавляет к выполнению запроса неоправданную нагрузку. Соединение таблицы самой с собой (Self-Join) в данном контексте не несет никакой смысловой нагрузки. При этом:
JOIN.Ссылка, хотя эти данные уже определены в первом наборе.Чтобы наши запросы всегда выполнялись быстро, важно соблюдать несколько правил:
ДокументОснование, убедитесь, что это поле добавлено в индекс. В 1С это достигается настройкой соответствующих параметров в конфигураторе (например, создание индекса в объекте конфигурации или использование критериев отбора).Дата (например, ЗаказПокупателя.Дата >= &ДатаНачала), позволит СУБД существенно сократить область поиска данных.Проанализировав ситуацию, мы пришли к однозначному выводу: первый запрос является предпочтительным. Он чист, понятен и не содержит избыточных операций соединения, которые лишь «засоряют» план выполнения запроса. Использование конструкции ГДЕ для фильтрации — это правильный и наиболее эффективный путь в разработке на платформе 1С. Второе решение — это пример «дичи», которая лишь неоправданно увеличивает время работы системы и нагрузку на сервер баз данных.