DB2 是否按主键排序数据

Rea*_*ces 8 db2 order-by

我最近与一位同事进行了讨论,他正在推动从生产查询中删除 order by 子句,因为order by 列与主键相同

经过长时间的讨论,我试图解释他不能保证基于主键的排序,最后的结论是他不会推动更改 MSSQL 查询。
但他仍打算更改 DB2 查询。

我无法立即找到反驳 DB2 按主键排序查询的文章,目前我想知道它是否确实如此。

所以我的问题是,如果没有 order by 子句,DB2 如何对查询进行排序?它使用主键吗?
在并行系统中,如果没有 order by 子句,如何保证数据按顺序正确输出?

ype*_*eᵀᴹ 19

不,你的同事错了。

所有 SQL 产品 - 根据 SQL 标准运行的 DBMS - 不保证查询输出的结果将以任何方式排序,除非ORDER BY查询中有子句

正如IBM DB2 文档所提到的

排序是根据语言元素中描述的比较规则执行的。空值高于所有其他值。如果您的排序规范不能确定完整的排序,则最后一个标识的排序键具有重复值的行具有任意顺序。如果不指定ORDER BY,则结果表的行具有任意顺序。


小智 11

正如 ypercube 的回答中指出的那样,当没有ORDER BY子句时,就没有定义的 order

我想补充的是,认识到 SQL 在很大程度上是一种抽象很重要,它没有一步一步地指定 DBMS 要做什么,而是指定您对最终结果的要求。

这意味着如果已经以确保正确顺序的方式查找数据,这是因为 DBMS 决定了这样的策略,然后它就会知道不需要额外的排序工作来满足ORDER BY子句的要求.

另一方面,如果您没有指定顺序对您很重要(即使它实际上是?),DBMS 会考虑到这一点,如果它找到了更有效的不同策略来找到正确的数据其他一些订单将利用您显然不关心订单的事实。(根据相关表、软件补丁等中不断增加的数据量,所选择的策略也可能会随着时间的推移而发生很大的变化。)

即,删除ORDER BY子句的好处很小(查询大小略小),但如果顺序实际上很重要,则可能会有很大的缺点。尤其如此,因为这可以很好地与测试数据集配合使用,并且通过验收测试只会导致严重的问题。