Время выполнения подзапроса для оператора IN - PullRequest
1 голос
/ 24 мая 2019

Есть ли документация о том, когда или как часто выполняется оператор select при использовании его в сочетании с IN ?

Например:

Таблица Таблица чисел

Numbers
1
2
3
4
5

Таблица Таблица объектов

Objects    | NumbersForObjects
Lawnmower  | 4
Hammer     | 2
Cheese     | 12
Plant      | 5

С помощью следующего запроса:

SELECT *
FROM ObjectsTable
WHERE ObjectsTable.NumbersForObjects IN (
        SELECT Numbers
        FROM NumbersTable
        )

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

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

1 Ответ

2 голосов
/ 24 мая 2019

Это зависит от типа физического полусоединения (показано в плане выполнения).

Если это хеш-соединение или соединение слиянием, оно оценивается только один раз.Если это вложенный цикл, он будет по крайней мере частично оценен для каждой внешней строки (но каждая оценка может остановиться, как только будет найдено первое соответствующее значение для этого выполнения).

В этом последнем случае SQL Server можетиногда добавляйте в план катушку для хранения результатов подзапроса (и избегайте необходимости повторной оценки из базовых таблиц каждый раз), если посчитаете, что это значительно уменьшит стоимость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...