是否有关于将select语句与 IN 结合使用的执行时间或执行频率的文档?
例如:
表 NumbersTable
Numbers
1
2
3
4
5
表 ObjectsTable
Objects | NumbersForObjects
Lawnmower | 4
Hammer | 2
Cheese | 12
Plant | 5
使用以下查询:
SELECT *
FROM ObjectsTable
WHERE ObjectsTable.NumbersForObjects IN (
SELECT Numbers
FROM NumbersTable
)
子查询是否在每次评估新行时获取执行IN语句的值?还是有可能像将其存储在数组中一样节省执行时间?
也许服务器的效率要比我想的要高,它已经和本地数组实现一样快。如果有某种通用文档说明如何在后台实现事物,并且有人不介意共享它,那也将是非常受欢迎的。
答案 0 :(得分:2)
这取决于物理半连接类型(在执行计划中显示)。
如果它是哈希联接或合并联接,则仅计算一次。如果它是嵌套循环,则将至少对每个外行进行部分评估(但是,一旦找到该执行的第一个匹配值,每次评估就会停止)。
对于这最后一种情况,SQL Server有时会在计划中添加一个假脱机以存储子查询结果(并避免每次都必须从基表中重新评估),如果这样做会充分降低成本。