Запрашивает ли 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-это табличное значение функция, которая возвращает список объявлений, которые имели определенные параметры.
Есть два вопроса:
- эта функция UDF_GetAdvertisements запрашивает все данные для каждой строки ? Я имею в виду, если у меня в таблице есть примерно 2000 рекламных объявлений, будет ли он запрашивать все эти и возвращать все рекламные объявления? Может быть, мне лучше сохранить возвращаемое значение функции в переменной ?
2.In в этой базе данных есть некоторые объявления без каких-либо вариантов, как я могу вернуть всю рекламу, если пользователь не выбирает никаких опций ?
Im использует табличные параметры в t-sql для передачи идентификаторов выбранных параметров через хранимую процедуру. Использовал небольшую справку с этой страницы: http://www.sommarskog.se/arrays-in-sql-2008.html
1 ответ:
Вам нужно будет проверить план выполнения.
WHERE ad.AdvertisementID IN (SELECT AdvertisementID FROM UDF_GetAdvertisements)
Будет реализован как логический оператор semi join. Физический тип соединения может быть любым из слияния, хэша или вложенных циклов.
Merge join и Hash join обрабатывают каждый вход один раз. Вложенные циклы обрабатывают внешний вход один раз, а внутренний столько раз, сколько строк во внешнем входе. Но даже если TVF отображается на внутренней стороне вложенного соединения циклов, результат может быть кэширован в катушке, а не многократная переоценка ТВФ.