你好我做了一个SQL测试,对一个问题很怀疑/好奇:
SQL引擎执行的查询和子查询的顺序是什么?
答案是
我选择了最后一个答案(假设它是最可靠的w.r.t.其他人)。 现在好奇心:
我在哪里可以读到这一点,简要介绍一下这种机制是什么?
谢谢。
答案 0 :(得分:25)
我认为答案4是正确的。有几点需要考虑:
子查询的类型 - 它是否相关。考虑一下:
SELECT *
FROM t1
WHERE id IN (
SELECT id
FROM t2
)
此处,子查询与外部查询无关。如果t2.id中的值的数量与t1.id相比较小,则首先执行子查询可能是最有效的,并将结果保存在内存中,然后在t1.id上扫描t1或索引,以匹配缓存的值。
但如果查询是:
SELECT *
FROM t1
WHERE id IN (
SELECT id
FROM t2
WHERE t2.type = t1.type
)
这里子查询是相关的 - 除非已知t1.type,否则无法计算子查询。由于t1.type的值可能因外部查询的每一行而异,因此对于外部查询的每一行,此子查询可以执行一次。
然后,RDBMS可能非常聪明,并且意识到t2.type只有几个可能的值。在这种情况下,它仍然可以使用用于不相关子查询的方法,如果它可以猜测执行子查询一次的成本会比为每行执行它更便宜。
答案 1 :(得分:16)
选项4已结束。
SQL是declarative:您告诉查询优化器您想要什么,并且它可以实现最佳(受时间/“成本”等)方式。对于外观相同的查询和表格,这可能会有所不同,具体取决于统计数据,数据分布,行数,并行性,而且上帝知道还有什么。
这意味着没有固定的订单。但它并非“在飞行中”
即使使用相同的服务器,架构,查询和数据,我看到执行计划也不同
答案 2 :(得分:1)
SQL引擎尝试优化(子)查询的执行顺序。决定这一点的部分称为查询优化器。查询优化器知道每个表中有多少行,哪些表具有索引以及哪些字段。它使用该信息来决定首先执行哪个部分。
答案 3 :(得分:1)
如果您想了解有关这些主题的内容,请获取Inside SQL Server 2008:T-SQL查询的副本。它有两个专门的章节,介绍如何在SQL Server中以逻辑和物理方式处理查询。
答案 4 :(得分:0)
这通常取决于您的DBMS,但......我认为第二个答案更合理。 如果没有子查询结果,通常无法计算Prime查询。