1

假设一个嵌套查询是这样的:

SELECT * 
FROM Table1 
WHERE Table1.val in 
(
   Select Table2.val 
   from Table2 
   where Table2.val>3
)

所以我的问题是实际的查询处理器如何评估这个 -

  • 他们是否首先评估最内部的查询,暂时存储结果,然后在上层查询中使用它?[如果子查询的结果很大,临时存储可能不够用]
  • 或者他们是否为外部查询的每个结果评估外部查询[需要对外部查询进行太多评估]

我是否遗漏了一些东西,它实际上是通过哪种方式实现的?

4

3 回答 3

3

这取决于。您可以从内部内部的外部查询中引用一个值。如果这样做,您将拥有所谓的相关子查询相关派生表。在这种情况下,它必须为父查询中的每个可能行重新计算查询。如果你不这样做,你就会拥有所谓的内联视图内联派生表,并且大多数数据库引擎都足够聪明,只能计算一次视图。

于 2013-10-02T16:23:10.833 回答
1

这可能会帮助你

有足够的内存可用于运行相当大的查询,并且查询的复杂性造成超时的可能性很小。嵌套查询的优点是为了速度几乎完全在物理内存中运行,除非执行查询所需的内存量超过分配给 SQL Server 的物理内存“占用空间”。

此外,由于嵌套查询的结构,SQL Server 查询优化器将尝试找到从查询中派生结果的最佳方式。(即优化器会将其转换为微操作并重新组织以高效运行)[来源]

由于重新排序,哪个查询首先运行很难说。在优化之后,很可能会运行某种形式的内部查询(大多数情况下,如果没有该结果,您将无法真正做事)。

SQL 查询不像你想象的那样运行堆栈调用。它们是一条为机器理解和翻译的单行指令。

于 2013-10-02T16:22:55.950 回答
0

您可以使用EXPLAIN以下方式获取有关执行计划的信息:

EXPLAIN SELECT * 
 FROM Table1 
 WHERE Table1.val in 
(
  Select Table2.val 
  from Table2 
  where Table2.val>3
)

例如,对于您的查询,您将得到 在此处输入图像描述

正如文件所述:

DEPENDENT SUBQUERY 评估不同于 UNCACHEABLE SUBQUERY 评估。对于 DEPENDENT SUBQUERY,子查询仅针对其外部上下文中变量的每组不同值重新评估一次。对于 UNCACHEABLE SUBQUERY,为外部上下文的每一行重新评估子查询。

所以你的第一个猜测是正确的。

有关更多信息,EXPLAIN请参阅: http ://dev.mysql.com/doc/refman/5.0/en/explain.html

于 2013-10-02T16:33:48.273 回答