Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在两台服务器上的同一数据库上运行的同一查询返回的顺序不同_Sql Server_Sql Server 2008 R2 - Fatal编程技术网

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

Sql server 在两台服务器上的同一数据库上运行的同一查询返回的顺序不同,sql-server,sql-server-2008-r2,Sql Server,Sql Server 2008 R2,我在两个SQL Server 2008R2实例上的两个数据库还原上运行了一个查询,它们返回的结果具有不同的顺序(在一台服务器上按ID排序,在另一台服务器上不按顺序排序) 如您所见,查询中没有ORDERBY子句,但结果的显示顺序不同 我曾尝试为这两个表重建索引,但没有成功 在服务器上运行SELECT*FROM bankCodes时,如果上述查询的排序是通过ID隐式完成的,则不会对结果进行排序(按主键列),而是在JOIN与bankFormat表连接后,对结果进行排序 我不知道还要找什么来解释这一点

我在两个SQL Server 2008R2实例上的两个数据库还原上运行了一个查询,它们返回的结果具有不同的顺序(在一台服务器上按ID排序,在另一台服务器上不按顺序排序)

如您所见,查询中没有ORDERBY子句,但结果的显示顺序不同

我曾尝试为这两个表重建索引,但没有成功

在服务器上运行
SELECT*FROM bankCodes
时,如果上述查询的排序是通过ID隐式完成的,则不会对结果进行排序(按主键列),而是在
JOIN
bankFormat
表连接后,对结果进行排序

我不知道还要找什么来解释这一点

还有谁能提出这是什么原因吗


可能与数据库排序、索引或主键/外键有关吗?

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

DB针对速度进行了优化。如果指定订单,数据将以这种方式传递。但如果没有它,它只会以任何顺序尽可能快地抓取记录


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

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

DB针对速度进行了优化。如果指定订单,数据将以这种方式传递。但如果没有它,它只会以任何顺序尽可能快地抓取记录


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

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

DB针对速度进行了优化。如果指定订单,数据将以这种方式传递。但如果没有它,它只会以任何顺序尽可能快地抓取记录


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

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

DB针对速度进行了优化。如果指定订单,数据将以这种方式传递。但如果没有它,它只会以任何顺序尽可能快地抓取记录


这就是为什么您不能依赖任何“隐式”排序。如果您需要,请定义一个,否则您将无法依赖任何内容。

当您不添加
order BY
子句时,为什么数据会以特定顺序从数据库返回:

  • 索引
  • 资料
  • 插入数据的顺序(这可能会影响数据在磁盘上的存储方式、分页方式等)
然后在查询时,还有很多其他事情:

  • 联接的顺序(指定联接的顺序和数据库引擎决定考虑/执行联接的顺序)
  • 数据库引擎决定执行联接或
    WHERE
    子句的方式,如哈希表、哈希集、合并联接、表查找等将影响数据的“自然”顺序
问题在于,这些理由并非详尽无遗,而且永远不会详尽无遗。当您没有指定订单时,数据库有一个“重新排序的许可证”,它将使用它,它不必解释它的操作

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

因此,你在这里找不到确切的答案

只有一条规则可以遵循:

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

这条规则的推论:

如果不添加
订单依据
条款,您将失去对(错误)订单的所有关注/投诉权利


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

  • 索引
  • 资料
  • 插入数据的顺序(这可能会影响数据在磁盘上的存储方式、分页方式等)
然后在查询时,还有很多其他事情:

  • 联接的顺序(指定联接的顺序和数据库引擎决定考虑/执行联接的顺序)
  • 数据库引擎决定执行联接或
    WHERE
    子句的方式,如哈希表、哈希集、合并联接、表查找等将影响数据的“自然”顺序
问题在于,这些理由并非详尽无遗,而且永远不会详尽无遗。当您没有指定订单时,数据库有一个“重新排序的许可证”,它将使用它,它不必解释它的操作

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

因此,你在这里找不到确切的答案

只有一条规则可以遵循:

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

这条规则的推论:

如果不添加
订单依据
条款,您将失去对(错误)订单的所有关注/投诉权利


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

  • 索引
  • 资料
  • SELECT C.ID AS CodeID , C.Format FormatId FROM bankCodes C INNER JOIN bankFormat F ON (C.Format = F.ID)