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

Igo*_*gor 27 sql subquery

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

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

答案是

  1. 主查询 - >子查询 - >子子查询等
  2. 子子查询 - >子查询 - >素数查询
  3. 整个查询一次解释
  4. 没有固定的解释序列,查询解析器在飞行中做出决定

我选择了最后一个答案(假设它是最可靠的其他人).现在的好奇心:

我在哪里可以读到这一点,简要说明所有这些机制是什么?

谢谢.

Rol*_*man 25

我认为答案4是正确的.有几个注意事项:

子查询的类型 - 它是否相关.考虑:

SELECT *
FROM   t1
WHERE  id IN (
             SELECT id
             FROM   t2
            )
Run Code Online (Sandbox Code Playgroud)

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

但如果查询是:

SELECT *
FROM   t1
WHERE  id IN (
             SELECT id
             FROM   t2
             WHERE  t2.type = t1.type
            )
Run Code Online (Sandbox Code Playgroud)

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

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

  • 如果在第二个例子而不是`from t2`我们有'from t2,t1`那么主查询和子查询没有相关.我对吗 ? (2认同)

gbn*_*gbn 17

方案4很接近.

SQL是声明性的:您告诉查询优化器您想要什么,并且它可以实现最佳(取决于时间/"成本"等)的方式.对于外观相同的查询和表格,这可能会有所不同,具体取决于统计数据,数据分布,行数,并行性和上帝知道还有什么.

这意味着没有固定的订单.但它并不是"在飞行中"

即使使用相同的服务器,架构,查询和数据,我看到执行计划也有所不同