Запрашивает ли Where-предложения с подзапросами в t-sql данные для каждой строки?


Я писал запрос на языке t-sql, который использует функцию в подзапросе, и наткнулся на два вопроса. Представьте себе таблицу объявлений следующим образом:

AdID- Name

Таблица параметров выглядит следующим образом:

OptionID - OptionName

И мусорная таблица (AdvertisementOptionLink) между этими двумя столбцами с двумя внешними ключами:

AdID - OptionID

Теперь я хочу запросить объявление, поскольку пользователь выбирает параметры . Я написал запрос примерно так:

SELECT * FROM Advertisement ad
INNER JOIN AdvertisementOptionLink aol
WHERE ad.AdvertisementID IN (SELECT AdvertisementID FROM UDF_GetAdvertisements)

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

Есть два вопроса:

  1. эта функция UDF_GetAdvertisements запрашивает все данные для каждой строки ? Я имею в виду, если у меня в таблице есть примерно 2000 рекламных объявлений, будет ли он запрашивать все эти и возвращать все рекламные объявления? Может быть, мне лучше сохранить возвращаемое значение функции в переменной ?

2.In в этой базе данных есть некоторые объявления без каких-либо вариантов, как я могу вернуть всю рекламу, если пользователь не выбирает никаких опций ?

Im использует табличные параметры в t-sql для передачи идентификаторов выбранных параметров через хранимую процедуру. Использовал небольшую справку с этой страницы: http://www.sommarskog.se/arrays-in-sql-2008.html

1 2

1 ответ:

Вам нужно будет проверить план выполнения.

WHERE ad.AdvertisementID IN (SELECT AdvertisementID FROM UDF_GetAdvertisements)

Будет реализован как логический оператор semi join. Физический тип соединения может быть любым из слияния, хэша или вложенных циклов.

Merge join и Hash join обрабатывают каждый вход один раз. Вложенные циклы обрабатывают внешний вход один раз, а внутренний столько раз, сколько строк во внешнем входе. Но даже если TVF отображается на внутренней стороне вложенного соединения циклов, результат может быть кэширован в катушке, а не многократная переоценка ТВФ.