SQL order by,group by,distinct和aggregation函数的进程顺序?

问题描述:

查询,如:SQL order by,group by,distinct和aggregation函数的进程顺序?

SELECT DISTINCT max(age), area FROM T_USER GROUP BY area ORDER BY area; 

那么,什么是秩序的过程ORDER BY,GROUP BY,DISTINCT和聚集功能?

也许不同的顺序会得到相同的结果,但会导致不同的性能。我想合并多个结果,我得到了sql,并解析了。所以我想知道标准sql剂量的顺序。

+0

不同只是 – 2014-12-02 04:36:26

+0

的一个特殊类群如果指定了distinct,那么没有group by? – wener 2014-12-02 04:38:53

+0

它是多余的。删除它,你会得到相同的结果,因为你已经按区域对它进行了分组。 – 2014-12-02 04:40:05

这比仅由/ aggregation/order by组更大。您想了解查询引擎如何创建结果集。在高层次上,这意味着创建一个执行计划,从表中检索数据到查询的工作集中,操纵数据以匹配请求的结果集,然后将结果集返回给调用者。对于非常简单的查询或者与表设计匹配的查询(或者为需要运行的查询设计的表格模式),这可能意味着将表或索引中的数据直接返回给调用者。更常见的是,这意味着思考更详细的级别,在那里你大致遵循这些步骤:

  1. 看看查询来确定哪些表将需要。
  2. 查看连接和子查询,以确定哪些表依赖于其他表。
  3. 查看连接和where子句中的条件,以及索引,以确定每个表需要多少空间,以及需要多少工作来提取每个表中的部分需要(查询与您的索引或存储在磁盘上的表匹配度如何)。
  4. 根据从步骤1到步骤3收集的信息,找出检索选择列表所需数据的最有效方法,而不管查询中包含表的顺序,也不管任何ORDER BY子句。对于这一步,“最有效”被定义为尽可能长时间地保持工作集尽可能小的方法。
  5. 开始遍历第4步指示的记录。如果存在GROUP BY子句,则必须根据现有发现的组检查每个记录,然后引擎才能确定是否应在工作中生成新行组。通常,执行此操作的最有效方法是查询引擎在此处执行有效的ORDER BY步骤,以便将结果的所有潜在行都物化为工作集,然后由GROUP BY中的列进行排序子句,并压缩,以便只有重复的行被删除。当发现该组的记录时,每个组的聚合函数结果是已更新
  6. 一旦所有指示的记录都被实现了,这样任何聚合函数的结果都是已知的,就可以评估HAVING子句。
  7. 现在,最后还可以考虑ORDER BY。
  8. 工作集中剩余的记录将返回给调用者。

复杂的,这只是一个开始。它没有开始考虑窗口函数,公用表表达式,交叉应用,数据透视和等等。但是,希望足以让您了解数据库引擎需要执行哪些工作。