首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL引擎执行查询和子查询的顺序是什么?

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

Stack Overflow用户
提问于 2010-02-15 06:52:58
回答 5查看 44.9K关注 0票数 34

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

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

答案是

  1. 主查询->子查询->子查询如
  2. 子查询->子查询->主查询
  3. 整个查询一次解释
  4. 没有固定的解释顺序,查询解析器在飞行时做出决定<

>G211

我选择了最后一个答案(只是假设它是最可靠的w.r.t.其他)。现在让我好奇的是:

我可以在哪里读到这方面的信息,简要地说,这一切背后的机制是什么?

谢谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-02-15 12:56:27

选项4是close。

SQL是declarative:你告诉查询优化器你想要什么,它就会找出最好的方式(取决于时间/“成本”等)。对于外观相同的查询和表,这可能会有所不同,这取决于统计数据、数据分布、行数、并行度和天知道还有什么。

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

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

票数 17
EN

Stack Overflow用户

发布于 2010-02-15 07:10:24

我认为答案4是正确的。有几个考虑因素:

子查询的类型-它是相关的还是无关的。考虑一下:

代码语言:javascript
复制
SELECT *
FROM   t1
WHERE  id IN (
             SELECT id
             FROM   t2
            )

在这里,子查询与外部查询不相关。如果与t1.id相比,t2.id中的值的数量较小,则可能最有效的方法是首先执行子查询,并将结果保存在内存中,然后扫描t1或t1.id上的索引,与缓存值进行匹配。

但是如果查询是:

代码语言:javascript
复制
SELECT *
FROM   t1
WHERE  id IN (
             SELECT id
             FROM   t2
             WHERE  t2.type = t1.type
            )

这里的子查询是相关的-除非t1.type已知,否则无法计算子查询。由于t1.type的值对于外部查询的每一行可能不同,因此该子查询可以对外部查询的每一行执行一次。

然而,RDBMS可能真的很聪明,并且意识到t2.type只有几个可能的值。在这种情况下,如果它可以猜测执行一次子查询的成本将比为每行执行一次子查询的成本更低,那么它仍然可以使用用于不相关的子查询的方法。

票数 31
EN

Stack Overflow用户

发布于 2010-02-15 07:03:12

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2263186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档