IN语句的子查询的执行时间

时间:2019-05-24 13:20:56

标签: sql sql-server tsql

是否有关于将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语句的值?还是有可能像将其存储在数组中一样节省执行时间?

也许服务器的效率要比我想的要高,它已经和本地数组实现一样快。如果有某种通用文档说明如何在后台实现事物,并且有人不介意共享它,那也将是非常受欢迎的。

1 个答案:

答案 0 :(得分:2)

这取决于物理半连接类型(在执行计划中显示)。

如果它是哈希联接或合并联接,则仅计算一次。如果它是嵌套循环,则将至少对每个外行进行部分评估(但是,一旦找到该执行的第一个匹配值,每次评估就会停止)。

对于这最后一种情况,SQL Server有时会在计划中添加一个假脱机以存储子查询结果(并避免每次都必须从基表中重新评估),如果这样做会充分降低成本。