Sql 更改了同一表中行的顺序
我的情况很复杂。有一个父数据库Sql 更改了同一表中行的顺序,sql,sql-server-2012,Sql,Sql Server 2012,我的情况很复杂。有一个父数据库P,然后有另一个数据库C,我听说它与P相同(都是SQL Server 2012)。它们都在不同的服务器上。我正在对P和C进行select*表格a。检索到的数据完全相同,但顺序不同。这两个表具有相同的元数据。可能的原因是什么 编辑1 问题是,我有一个从我的客户机得到的存储过程,它在p上运行,然后在SSRS报告中使用。我没有访问P或报告的权限。我正在C上运行相同的存储过程。那就是当我得到相同的行,但顺序不同。在运行C的存储过程中,除了已经存在的子句外,没有添加其他ord
P
,然后有另一个数据库C
,我听说它与P
相同(都是SQL Server 2012)。它们都在不同的服务器上。我正在对P
和C
进行select*表格a
。检索到的数据完全相同,但顺序不同。这两个表具有相同的元数据。可能的原因是什么
编辑1
问题是,我有一个从我的客户机得到的存储过程,它在p
上运行,然后在SSRS报告中使用。我没有访问P
或报告的权限。我正在C
上运行相同的存储过程。那就是当我得到相同的行,但顺序不同。在运行C
的存储过程中,除了已经存在的子句外,没有添加其他order by
子句。如果数据库相同,数据相同,表结构也相同,为什么行的显示顺序会不同
编辑2
tableA
COL1 COL2 COL3 COL4
---------- ---------- ---------- ----------
100 C 1 2015-01-01
101 A 2 2015-01-05
102 A 2 2014-01-01
103 B 4 2011-09-01
104 C 1 2015-01-01
如果在上述表格a
(COL1
是主键
),我按COL2、COL3、COL4从表格a中选择*,然后:
p
COL1 COL2 COL3 COL4
---------- ---------- ---------- ----------
102 A 2 2014-01-01
101 A 2 2015-01-05
103 B 4 2011-09-01
100 C 1 2015-01-01
104 C 1 2015-01-01
结果显示在C
COL1 COL2 COL3 COL4
---------- ---------- ---------- ----------
102 A 2 2014-01-01
101 A 2 2015-01-05
103 B 4 2011-09-01
104 C 1 2015-01-01
100 C 1 2015-01-01
这就是问题所在
PS-DBs的排序规则发生变化除非为表指定
主键
,否则严格来说,不会定义数据的列出顺序。在MSSQL中,通常有一个“内部”顺序,对于每个表来说似乎都是可复制的,但是,正如您所观察到的,对于两个不同服务器上的“相同”表来说,这很可能是不同的。如果要在两台服务器上为表建立相同的顺序,应:
- 引入主键
- 或者始终使用
选择
和
按顺序
orderby
子句,也没有使用orderby
;无法保证返回结果的顺序
即使在同一台服务器上多次运行查询,也可能会观察到结果输出中数据的不同顺序
为了确保这一点,在查询时始终使用orderby子句
select * from tableA order by some_column
如其他答案中所述,除非您指定一个顺序,否则SQL Server可以并且很可能以任意顺序返回结果。实际原因是实现细节,取决于SQL Server在编译查询时使用的查询优化决策 试试这个。在返回结果的查询结束时,添加查询提示
选项(maxdop 1)
。然后对这两个数据库进行查询。结果是否以相同的顺序返回
这个。如果SQL Server计算查询的巨大成本,它可能会选择并行运行查询(取决于MAXDOP Server选项和查询提示)。当查询并行运行时,不同的线程可能会在其他线程之前提供结果,并且每次运行的结果顺序可能不同
如果没有orderby
子句,查询顺序也可以取决于查询计划。影响查询计划的任何内容都会影响查询顺序。这方面的一个例子是。例如,以查询为例,select*from[Addresses],其中[Country]=“luxen”
。此查询可能使用索引查找,然后使用书签查找来返回结果,因为卢森堡的人口与地址数量相比相当少。这可能导致按[Country]
索引排序的行
现在,尝试从[Addresses]中选择[Country]=“China”。此查询可能使用表扫描,因为该查询将返回所有列,并且扫描表的成本可能低于对[Country]=“China”
进行索引查找,然后执行查询。此查询可能按磁盘上数据的物理顺序排序。除非您指定了一个order by子句,否则没有任何担保
更新
您提供了一个示例查询和模式。
orderbycol2、COL3、COL4
子句将保证结果按这3列排序。但是,如果这3列中有重复的值,则不能保证以一致的顺序返回这些行。如果这对您很重要,则必须修改order by
子句以包含主键。主键(甚至不是集群主键)保证select
集合的顺序,而不使用order by
。除非orderby
子句指定排序,否则结果集是无序的。你可能会发现这篇文章很有趣:@BhupeshC,这正是答案中所说的;如果没有订购方,则无法保证订单。如果可以保证订单,则无需执行订单。如果您有权访问在P
上运行的报告/过程;多次运行该过程,查看结果数据的顺序是否完全不同。如果愿意,您可以在问题中发布过程代码正文。sp中已经指定了order by
子句。该报告已在P
上运行多次。顺序不变。在C
上运行时,也不会更改为C
上已经出现的顺序。更多信息请参见我的编辑。orderbycol2,COL3,COL4
正在做它应该做的事情。只有PK列COL1
的顺序不同。如果您在这两台机器中都按col1执行订单
,该怎么办?如果是feas,您可以发布一次表架构吗