[ Вопрос дня ] Язык запросов: отличие условий в соединении таблиц от условий в блоке «ГДЕ»

Доброго дня, коллеги!

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

Тренер Мастер-группы курса Разработка и оптимизация запросов в 1С:Предприятие 8 помогает слушателям разобраться в тонкостях работы запросов, используя простые примеры.

Вопрос

В одном из уроков устанавливается условие на тип цен на закладке СВЯЗИ. В чем будет отличие, если сделать это на закладке УСЛОВИЯ? Чем руководствоваться при выборе?

Ответ

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

В данном видеоуроке при соединении таблиц уже необходимо учитывать только цены определенного вида, чтобы цены другого вида вообще не мешали, т.к. нужно получать максимальный период только среди цен определенного вида.

Пример:

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

Первый запрос:

ВЫБРАТЬ
    Товары.Товар КАК Товар,
    Цены.Цена КАК Цена
ИЗ
    Товары КАК Товары
        ЛЕВОЕ СОЕДИНЕНИЕ Цены КАК Цены
        ПО Товары.Товар = Цены.Товар
            И (Цены.ВидЦен = &ВидЦен)

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

Второй запрос:

ВЫБРАТЬ
    Товары.Товар КАК Товар,
    Цены.Цена КАК Цена
ИЗ
    Товары КАК Товары
        ЛЕВОЕ СОЕДИНЕНИЕ Цены КАК Цены
        ПО Товары.Товар = Цены.Товар
ГДЕ
    Цены.ВидЦен = &ВидЦен

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

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

Это пример разобранного вопроса из Мастер-группы курса
Разработка и оптимизация запросов в 1С:Предприятие 8.

Описание курса и примеры видео

Комментарии / обсуждение (5):

  1. Teploukhov

    С вышеуказанным примером все и так ясно. Гораздо интереснее было бы узнать, отличие условий в соединении таблиц от условий в блоке “ГДЕ” при внутреннем соединении. Результат запроса будет ровно таким же. А как та или иная реализация отразится на производительности? Если используется множество таблиц с внутренним соединением, можно ли считать, что создание сложного условия соединения окажется более выигрышным, нежели соединение по простому ключу и использование условия в секции “ГДЕ”?

    • Василий Ханевич

      Добрый день!
      Самый правильный вариант – сравнить оба варианта по производительности, проанализировать планы запросов для конкретной ситуации.
      При этом надо учитывать, что у оптимизатора СУБД есть специальные “приемы” для выполнения соединений (Hash Join или Merge Join), которые могут обеспечить получение данных оптимальным образом.

  2. Кирилл

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

    • Василий Ханевич

      Добрый день!
      Да, Вы правильно написали. Такое левое соединение фактически “превращается” во внутреннее.
      Перемещение условия с закладки Связи в конструкторе запроса на закладку Условия может изменить результат запроса.
      Подобный пример и рассматривается в курсе.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Вход на сайт

Зарегистрироваться

Подтверждение регистрации будет отправлено на указанный e-mail.

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

Восстановить доступ

E-mail или логин

Ссылка на создание нового пароля будет отправлена на указанный e-mail.