代码之家  ›  专栏  ›  技术社区  ›  Igor

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

  •  27
  • Igor  · 技术社区  · 16 年前

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

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

    答案是

    1. 主查询->子查询->子查询等
    2. 子查询->子查询->主查询
    3. 一次解释整个查询
    4. 没有固定的解释顺序,查询解析器会动态地做出决定。

    我选择了最后一个答案(只是假设它是最可靠的W.R.T.其他答案)。 好奇心:

    我在哪里可以读到这篇文章,并且简单地说,在这一切之下,机制是什么?

    谢谢您。

    5 回复  |  直到 16 年前
        1
  •  16
  •   gbn    16 年前

    选项4关闭。

    SQL是 declarative :您告诉查询优化程序您想要什么,它会找到最好的方法(取决于时间/成本等)。对于外观相同的查询和表,这可能会有所不同,具体取决于统计信息、数据分布、行数、并行性以及上帝知道的其他内容。

    这意味着没有固定的顺序。但这并不完全是“在飞”

    即使使用相同的服务器、模式、查询和数据,我也看到执行计划不同

        2
  •  25
  •   Roland Bouman    16 年前

    我认为答案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只有几个可能的值。在这种情况下,如果可以猜测执行一次子查询的成本将比为每行执行一次子查询的成本更低,那么它仍然可以使用用于不相关子查询的方法。

        3
  •  1
  •   Stephan Eggermont    16 年前

    SQL引擎试图优化(子)查询的执行顺序。决定这一点的部分称为查询优化器。查询优化器知道每个表中有多少行,哪些表有索引,哪些字段。它使用这些信息来决定先执行哪个部分。

        4
  •  1
  •   Frank Kalis    16 年前

    如果您想了解有关这些主题的内容,请获取InsideSQLServer2008:T-SQL查询的副本。它有两章专门介绍如何在SQL Server中逻辑和物理地处理查询。

        5
  •  0
  •   Adelf    16 年前

    这通常取决于你的数据库管理系统,但是…我认为第二个答案更合理。 没有子查询结果通常无法计算主查询。