我在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个广告,它会查询所有那些并返回所有的广告ID吗?我最好将函数返回值保存在变量中吗?
醇>2.在这个数据库中有一些没有任何选项的广告如果用户选择没有选项我怎么能返回所有广告呢?
我在t-sql中使用表值参数通过存储过程传递选定的选项ID。 在此页面上使用了一些帮助:http://www.sommarskog.se/arrays-in-sql-2008.html
答案 0 :(得分:2)
您需要检查执行计划。
WHERE ad.AdvertisementID IN (SELECT AdvertisementID FROM UDF_GetAdvertisements)
将作为逻辑semi join运算符实现。物理连接类型可以是merge,hash或嵌套循环中的任何一种。
合并连接和散列连接过程每次输入一次。嵌套循环处理外部输入一次,内部循环处理次数与外部输入中的行一样多次。但即使TVF显示在嵌套循环连接的内侧,结果也可能缓存在假脱机中,而不是反复重新评估TVF。