【问题标题】:Does Where Clauses with sub-queries in t-sql queries the data for each row?t-sql 中带有子查询的 Where 子句是否查询每一行的数据?
【发布时间】:2012-11-14 19:43:01
【问题描述】:

我在 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 个广告,它会查询所有这些广告并返回所有广告 ID?我最好将函数返回值保存在变量中吗?

2.在这个数据库中有一些广告没有任何选项,如果用户没有选择任何选项,我该如何返回所有广告?

我在 t-sql 中使用表值参数通过存储过程传递选定的选项 ID。 使用了这个页面的一点帮助:http://www.sommarskog.se/arrays-in-sql-2008.html

【问题讨论】:

  • 每个问题一个问题。
  • @MartinSmith OK 让我们坚持第一个 ;)

标签: sql sql-server tsql stored-procedures table-valued-parameters


【解决方案1】:

您需要检查执行计划。

WHERE ad.AdvertisementID IN (SELECT AdvertisementID FROM UDF_GetAdvertisements)

将被实现为逻辑semi join 运算符。物理连接类型可以是任何合并、散列或嵌套循环。

Merge join 和 Hash join 对每个输入处理一次。嵌套循环处理外部输入一次,内部处理一次的次数与外部输入中的行数相同。但即使 TVF 显示在嵌套循环连接的内侧,结果也可能会缓存在假脱机中,而不是反复重新评估 TVF。

【讨论】:

  • 谢谢,我认为 OUTER APPLY 是我两个问题的答案。
猜你喜欢
  • 2015-09-12
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
相关资源
最近更新 更多