在两台服务器上的同一数据库上运行的相同查询返回不同的顺序

时间:2014-08-01 08:32:20

标签: sql-server sql-server-2008-r2

我有一个查询,我在两个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}}表,结果是有序的。

我不知道还有什么可以解释这个。

还有其他人可以提出可能导致这种情况的原因吗?

是否可能与数据库归类,索引或主/外键有关?

2 个答案:

答案 0 :(得分:2)

这是因为您没有添加order by子句。

数据库针对速度进行了优化。如果您指定订单,则数据将以这种方式交付。但如果没有它,它将尽可能快地以任何顺序获取记录。

这就是为什么你不能依赖任何“隐含”的排序。如果需要,定义一个,否则你不能依赖任何东西。

答案 1 :(得分:1)

当您不添加ORDER BY子句时,以特定顺序从数据库返回数据的原因包含多个元素:

  • 索引
  • 数据
  • 插入数据的顺序(可能影响数据存储在磁盘上的方式,分成页面等)。

然后在查询时,还有很多其他的事情:

  • 连接的顺序(指定它们的顺序和数据库引擎决定考虑/执行它们的顺序)
  • 数据库引擎如何决定执行连接或WHERE子句,例如哈希表,哈希集,合并连接,表查找等,将影响数据可用的“自然”顺序

问题是这些原因并非详尽无遗,而且永远不会。当您没有指定订单时,数据库具有“重新订购许可证”,并且它将使用它,除此之外不必解释其操作。

因此,如果您想知道某些数据以特定方式返回的具体原因,您可以 查看执行计划,但它可能无法说明整体情况。这张照片也是当前执行计划的(可能是人为的)快照。当数据或索引发生变化时,它可能随时发生变化。

因此,你不会在这里找到明确的答案。

只有一条规则可以遵循:

  

如果您关心返回数据的顺序,请添加ORDER BY

该规则的推论:

  

如果您未添加ORDER BY条款,则您将失去关注/投诉(错误)订单的所有权利