哪个序列是SQL引擎执行的查询和子查询?

时间:2010-02-14 22:52:58

标签: sql subquery

你好我做了一个SQL测试,对一个问题很怀疑/好奇:

SQL引擎执行的查询和子查询的顺序是什么?

答案是

  1. 主要查询 - >子查询 - >子查询等
  2. 子子查询 - >子查询 - >主要查询
  3. 一次解释整个查询
  4. 没有固定的解释序列,查询解析器在飞行中做出决定
  5. 我选择了最后一个答案(假设它是最可靠的w.r.t.其他人)。 现在好奇心:

    我在哪里可以读到这一点,简要介绍一下这种机制是什么?

    谢谢。

5 个答案:

答案 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查询。