Использование подзапроса против переменной в качестве фильтра - PullRequest
0 голосов
/ 10 января 2019

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

Присоединиться к astComponents CAT ON Concat (CAT.Code, '_', CAT.Specification) = AT.Code и CAT.AssetId = (Выберите первый Id из astAssets, где Code = '2018090125')

Общее время выполнения запроса: 00: 01: 25

Затем я решил создать из этого фильтра переменную, чтобы посмотреть, как это повлияет на время выполнения. Переменная объявляется перед оператором select и используется в операторе join:

Объявить @Mach int

Set @Mach = (Выберите топ 1 Id из astAssets, где Код = '2018090125')

-

Присоединиться к astComponents CAT ON Concat (CAT.Code, '_', CAT.Specification) = AT.Code и CAT.AssetId = @ Mach

Общее время выполнения запроса: 00: 00: 15

Может кто-нибудь объяснить мне эту большую разницу во времени выполнения? Подзапрос для извлечения машинного кода очень быстрый, но я думаю, что наличие подзапроса в качестве фильтра, противоположного переменной, приводит к его выполнению в каждой строке.

Ура!

1 Ответ

0 голосов
/ 10 января 2019

Подзапрос в вашем более крупном запросе выглядит как некоррелированный :

(SELECT TOP 1 Id FROM astAssets WHERE Code = '2018090125')

То есть SQL Server может оценивать этот подзапрос полностью независимо от остальной части вашего запроса. Если это так, то штраф за то, что он у вас есть, просто штраф за один раз выполнение подзапроса.

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

Примечание: SQL Server достаточно умен, чтобы признать, что подзапрос не меняет строку на строку. Таким образом, он, скорее всего, выполнит его один раз и кеширует результат где-нибудь.

...