我有一个查询,我在两个SQL Server 2008R2实例上的两个数据库还原上运行,它们以不同的顺序返回结果(在一台服务器上,它们按ID排序,另一方面它们不是&t; t订购)
SELECT
C.ID AS CodeID
, C.Format FormatId
FROM bankCodes C
INNER JOIN bankFormat F ON (C.Format = F.ID)
正如您所看到的,查询中没有ORDER BY子句,但显示结果的顺序是不同的。
我曾尝试重建这两个表的索引,但它没有用。
在服务器上运行SELECT * FROM bankCodes
时,ID会隐式执行上述查询的排序,但结果不是按主键列排序的,而是JOIN
bankFormat
之后的结果1}}表,结果是有序的。
我不知道还有什么可以解释这个。
还有其他人可以提出可能导致这种情况的原因吗?
是否可能与数据库归类,索引或主/外键有关?
答案 0 :(得分:2)
这是因为您没有添加order by
子句。
数据库针对速度进行了优化。如果您指定订单,则数据将以这种方式交付。但如果没有它,它将尽可能快地以任何顺序获取记录。
这就是为什么你不能依赖任何“隐含”的排序。如果需要,定义一个,否则你不能依赖任何东西。
答案 1 :(得分:1)
当您不添加ORDER BY
子句时,以特定顺序从数据库返回数据的原因包含多个元素:
然后在查询时,还有很多其他的事情:
WHERE
子句,例如哈希表,哈希集,合并连接,表查找等,将影响数据可用的“自然”顺序问题是这些原因并非详尽无遗,而且永远不会。当您没有指定订单时,数据库具有“重新订购许可证”,并且它将使用它,除此之外不必解释其操作。
因此,如果您想知道某些数据以特定方式返回的具体原因,您可以 查看执行计划,但它可能无法说明整体情况。这张照片也是当前执行计划的(可能是人为的)快照。当数据或索引发生变化时,它可能随时发生变化。
因此,你不会在这里找到明确的答案。
只有一条规则可以遵循:
如果您关心返回数据的顺序,请添加
ORDER BY
该规则的推论:
如果您未添加
ORDER BY
条款,则您将失去关注/投诉(错误)订单的所有权利