你好我做了一个SQL测试,对一个问题很怀疑/好奇:
哪个序列是SQL引擎执行的查询和子查询?
答案是
我选择了最后一个答案(假设它是最可靠的其他人).现在的好奇心:
我在哪里可以读到这一点,简要说明所有这些机制是什么?
谢谢.
Rol*_*man 25
我认为答案4是正确的.有几个注意事项:
子查询的类型 - 它是否相关.考虑:
SELECT *
FROM t1
WHERE id IN (
SELECT id
FROM t2
)
Run Code Online (Sandbox Code Playgroud)
这里,子查询与外部查询不相关.如果t2.id中的值的数量与t1.id相比较小,则首先执行子查询可能是最有效的,并将结果保存在内存中,然后在t1.id上扫描t1或索引,以匹配缓存的值.
但如果查询是:
SELECT *
FROM t1
WHERE id IN (
SELECT id
FROM t2
WHERE t2.type = t1.type
)
Run Code Online (Sandbox Code Playgroud)
这里子查询是相关的 - 除非知道t1.type,否则无法计算子查询.由于t1.type的值可能因外部查询的每一行而异,因此可以对外部查询的每一行执行一次该子查询.
然后,RDBMS可能非常聪明,并且意识到t2.type只有几个可能的值.在这种情况下,它仍然可以使用用于不相关子查询的方法,如果它可以猜测执行子查询一次的成本将比为每行执行它更便宜.