DB2是否通过主键对数据进行排序


8

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

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

我无法立即找到一篇文章,以证明DB2通过主键对查询进行排序,并且当前正在想知道是否这样做。

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

Answers:


18

不,你的同事错了。

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

正如IBM DB2文档所提到的

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


IBM文档FTW“如果他们遵循SQL标准行事”就显得格外重要。
WernerCD 2014年

@WernerCD没有DBMS 100%符合该标准(并且有许多版本。)但是他们声称遵守许多部分。我希望至少要有区别的地方,形成文件。
ypercubeᵀᴹ

是的,这就是为什么我为“标准”上的IBM文档+1的原因。“期望的”与“实际的”可以而且肯定会咬住你。
WernerCD 2014年

11

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

我想补充的一点是,认识到SQL非常抽象是很重要的,它并没有一步一步地指定DBMS要做的事情,而是指定了最终结果的要求。

这意味着,如果已经以确保正确顺序的方式查询了数据,则是这样,因为DBMS决定了这种策略,因此它将已经知道不需要额外的排序工作即可满足该ORDER BY条款的要求。。

另一方面,如果您未指定顺序对您来说很重要(即使实际上是顺序?),则DBMS会考虑到这一点,并且如果找到了一种更有效地在其中找到正确数据的策略。其他一些订单将利用您显然并不关心该订单的事实。(基于相关表,软件补丁等中不断增加的数据量,所选择的策略也可能会随着时间的流逝而改变)

即,删除该ORDER BY子句的上行空间很小(查询大小略小),但如果顺序实际上很重要,则潜在的巨大下行空间。特别是这样,因为这可以很好地与测试数据集配合使用,并且通过验收测试只会导致严重的问题。


1
他在部署表中给出的原因是““排序依据正在占用CPU资源,而主键已经隐含了该顺序”。这对我来说听起来很不对劲(到目前为止的答案已证明)
Reaces 2014年

@Reaces DB2是默认使用'heap'表还是更像带有聚集索引的SQL Server?它不会改变答案,但可以更容易证明:)
杰克说尝试topanswers.xyz 2014年

@Jack Douglas,SQL Server和DB2中的集群是不同的概念。在以下线程中,我学到了很多有关SQL Server中群集的知识:groups.google.com/d/msg/comp.databases.ms-sqlserver/P7Wcs4NcF4s/…。我对SQL Server很熟悉,但对DB2不熟悉,所以您可能需要看看。
Lennart 2014年

缺省情况下,除非指定了聚集索引,否则缺省情况下通常通常将DB2中的@Reaces表“聚集”在主键上。
克里斯·奥尔德里奇

1
@ChrisAldrich -该语句仅对z / OS上的DB2是正确的。
mustaccio 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.