我最近与一位同事讨论过,他正在推动从生产查询中删除 order by 子句,因为order by column 与 primary key 相同。
经过长时间的讨论,我试图解释他不能保证基于主键的排序,最后的结论是他不会推动改变 MSSQL 查询。
但他仍然打算更改 DB2 查询。
我无法立即找到一篇反驳 DB2 按主键排序查询的文章,目前我想知道它是否确实如此。
所以我的问题是,如果没有 order by 子句,DB2 如何对查询进行排序?它使用主键吗?
在并行系统中,如何保证数据在没有 order by 子句的情况下正确排序?
不,你的同事错了。
所有 SQL 产品(根据 SQL 标准运行的 DBMS)不保证查询输出的结果将以任何方式排序,除非查询中有
ORDER BY
子句。正如IBM DB2 文档所提到的:
正如 ypercube 的回答中指出的那样,当没有
ORDER BY
子句时,就没有定义的 order。我想补充的是,重要的是要意识到 SQL 在很大程度上是一种抽象,它没有逐步指定 DBMS 要做什么,而是指定了您对最终结果的要求。
这意味着如果已经以确保正确顺序的方式查找数据,这是因为 DBMS 决定了这样的策略,然后它就会知道不需要额外的排序工作来满足
ORDER BY
子句的要求.另一方面,如果您没有指定订单对您很重要(即使它实际上是重要的?),DBMS 将考虑这一点,并且如果它找到一种更有效的不同策略来找到正确的数据其他一些订单将利用您显然不关心订单的事实。(基于相关表格、软件补丁等中数据量的增加,所选择的策略也可能随着时间的推移而发生变化。)
即,删除该
ORDER BY
子句几乎没有好处(查询大小略小),但如果订单实际上很重要,则可能存在巨大的不利影响。尤其如此,因为这可以很好地与测试数据集一起使用,并且通过验收测试只会导致严重的问题。