Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL引擎执行查询和子查询的顺序是什么?_Sql_Subquery - Fatal编程技术网

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

SQL引擎执行查询和子查询的顺序是什么?,sql,subquery,Sql,Subquery,你好,我做了一个SQL测试,对一个问题表示怀疑/好奇: SQL引擎执行的查询和子查询的顺序是什么? 答案是 主查询->子查询->子查询等 子查询->子查询->主查询 整个查询一次解释一次 没有固定的解释顺序,查询解析器会动态地做出决定 我选择了最后一个答案(假设它是最可靠的w.r.t.其他答案)。 现在好奇: 我从哪里可以了解到这一点,并简要说明所有这些情况下的机制是什么? 谢谢。这通常取决于您的数据库管理系统,但是。。。我认为第二个答案更合理。 如果没有子查询结果,通常无法计算主查询。SQL引

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

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

答案是

  • 主查询->子查询->子查询等
  • 子查询->子查询->主查询
  • 整个查询一次解释一次
  • 没有固定的解释顺序,查询解析器会动态地做出决定
  • 我选择了最后一个答案(假设它是最可靠的w.r.t.其他答案)。 现在好奇:

    我从哪里可以了解到这一点,并简要说明所有这些情况下的机制是什么?


    谢谢。

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

    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。子查询将不再有对外部查询的任何引用,因此将是不相关的。