2012-05-24 27 views

回答

6

编号GROUP BY对返回行的顺序没有标准影响。这就是ORDER BY的设计目的。

如果您获得某种GROUP BY返回的某种可重复或可预测的排序顺序,那么您的数据库管理系统中的某些内容未在标准中定义。

2

正如前面的回答所解释的,除ORDER BY之外的任何基本SQL构造都没有暗示排序。

但是,要计算GROUP BY,可能会发生索引扫描或内存中排序(以创建存储桶),并且此类索引扫描或排序意味着按排序顺序遍历数据。因此,一个特定的数据库往往表现如此,这并非偶然。但是,不要依赖它,因为使用一组不同的索引,或者甚至只是一个不同的查询计划(可能会触发少量插入和/或重新启动数据库服务器),这种行为可能会相当不同。

还要注意的是重新排序ORDER BY子句中的列列表将导致重新排序可靠的输出,而在GROUP BY条款重新排序列列表将有可能没有任何效果。

没有使用看似“冗余”ORDER BY的性能成本。查询计划可能是相同的,如果原始的已经保证了排序的输出。

+0

其实,订购不是*必需*。我会同意它几乎总是这样做,因为不这样做会大大降低性能,但它不是我见过的任何SQL标准所要求的。问题是否按照任何标准执行了“GROUP BY”排序顺序,并且对该问题的答案是“否”。 :) –

+0

@KenWhite - 这就是为什么我决定增加更多的细节来解释OP已经观察和预期的内容之前,我已经upvoted你的答案。 :-) –

+0

为什么我没有降低你的评分,即使它在技术上不是问题的答案。我也想澄清你在说什么,但是,也就是我的意见。 :-) –

1

对排序GROUP BY的输出的Um不在标准中,因为有标准的分组算法,不会按顺序产生结果。

其中最常见的是使用哈希表来完成分组。

此外,在多线程服务器上,可以对数据进行排序,但结果将按处理器逐个返回。无法保证最低订单处理器将首先返回数据。

而且,在并行机器上,可以使用各种方法在处理器之间分割数据。例如,以“a”结尾的所有字符串可能会转到一个处理器。所有这些以“b”结束于另一个。这些可以在本地排序,但结果本身不会整体排序。

保证分类后的mysql等数据库正在做一个糟糕的设计决策。除了不符合标准之外,这些数据库要么限制算法的选择,要么对订购进行额外的处理。

+0

+1了解,但我不相信你提供这样的保证,除非你可以提供参考。版本5.0的文档似乎另有说明。 –