0

GROUP BY 的结果是否应该按照 SQL 标准进行排序?

许多数据库返回 GROUP BY 的排序结果,

但它是由 SQL92 或其他标准强制执行的吗?

4

3 回答 3

6

No.GROUP BY对返回的行的顺序没有标准影响。这 ORDER BY就是设计要做的。

如果您得到某种由 a 返回的可重复或可预测的排序顺序GROUP BY,则说明您的 DBMS 中正在执行的操作未在标准中定义。

于 2012-05-24T19:20:11.650 回答
2

正如前面的回答所解释的,除了ORDER BY.

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

另请注意,重新排序ORDER BY子句中的列列表将导致可靠地重新排序输出,而重新排序GROUP BY子句中的列列表可能没有任何效果。

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

于 2012-05-24T19:27:30.757 回答
1

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

其中最常见的是使用哈希表进行分组。

此外,在多线程服务器上,可以对数据进行排序,但结果将逐个处理器返回。不能保证最低阶的处理器是第一个返回数据的。

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

诸如 mysql 之类的保证在 group by 之后进行排序的数据库正在做出糟糕的设计决策。除了不符合标准之外,这样的数据库要么限制算法的选择,要么对排序施加额外的处理。

于 2012-05-24T19:53:30.827 回答