SQL引擎执行查询和子查询的顺序是什么?
你好,我做了一个SQL测试,对一个问题表示怀疑/好奇: SQL引擎执行的查询和子查询的顺序是什么? 答案是SQL引擎执行查询和子查询的顺序是什么?,sql,subquery,Sql,Subquery,你好,我做了一个SQL测试,对一个问题表示怀疑/好奇: SQL引擎执行的查询和子查询的顺序是什么? 答案是 主查询->子查询->子查询等 子查询->子查询->主查询 整个查询一次解释一次 没有固定的解释顺序,查询解析器会动态地做出决定 我选择了最后一个答案(假设它是最可靠的w.r.t.其他答案)。 现在好奇: 我从哪里可以了解到这一点,并简要说明所有这些情况下的机制是什么? 谢谢。这通常取决于您的数据库管理系统,但是。。。我认为第二个答案更合理。 如果没有子查询结果,通常无法计算主查询。SQL引
谢谢。这通常取决于您的数据库管理系统,但是。。。我认为第二个答案更合理。
如果没有子查询结果,通常无法计算主查询。SQL引擎尝试优化(子)查询的执行顺序。决定这一点的部分称为查询优化器。查询优化器知道每个表中有多少行,哪些表有索引,哪些字段有索引。它使用这些信息来决定首先执行哪个部分。我认为答案4是正确的。有几个考虑因素: 子查询的类型-是否相关。考虑:
SELECT *
FROM t1
WHERE id IN (
SELECT id
FROM t2
)
在这里,子查询与外部查询不相关。如果t2.id中的值数量比t1.id中的值数量小,那么首先执行子查询并将结果保存在内存中,然后扫描t1或t1.id上的索引,并与缓存的值进行匹配可能是最有效的
但如果问题是:
SELECT *
FROM t1
WHERE id IN (
SELECT id
FROM t2
WHERE t2.type = t1.type
)
这里子查询是相关的-除非已知t1.type,否则无法计算子查询。由于t1.type的值对于外部查询的每一行可能不同,因此可以对外部查询的每一行执行此子查询一次
然后,RDBMS可能真的很聪明,并且意识到t2.type只有几个可能的值。在这种情况下,如果可以猜测执行一次子查询的成本比执行每一行的成本更低,那么它仍然可以使用用于不相关子查询的方法。选项4很接近
SQL是:你告诉查询优化者你想要什么,它会找出最好的方法(取决于时间/成本等)。根据统计数据、数据分布、行计数、并行性和其他情况,对于外观相同的查询和表,这可能会有所不同
这意味着没有固定的顺序。但这并不完全是“在飞”
即使使用相同的服务器、模式、查询和数据,我看到的执行计划也不同如果您想了解这些主题,请获取一份Inside SQL Server 2008:T-SQL查询的副本。它有两个专门的章节介绍如何在SQL Server中逻辑和物理地处理查询。另一方面,子查询通常依赖于优先级查询(相关子查询)。ps:phpclub的您好;-)Thake you for the response,关于在哪里阅读的想法,最好的来源?如果在第二个示例中,我们没有使用t2中的
,而是使用t2中的,t1中的,那么主查询和子查询是不相关的。我说得对吗?没错。子查询WHERE中的表达式t1.type随后将解析为子查询FROM子句中的t1,而不是外部查询的t1。子查询将不再有对外部查询的任何引用,因此将是不相关的。