更改了同一个表

时间:2015-05-30 20:57:38

标签: sql sql-server-2012

我的情况很复杂。有一个父数据库P,然后有另一个数据库C,我被告知与P相同(两者都是SQL Server 2012)。它们都在不同的服务器上。我正在对select * from tableAP进行C。检索到的数据完全相同,但顺序不同。两个表都具有相同的元数据。可能的原因是什么?

编辑1

问题是,我有一个存储过程,我从我的客户端获得它,它运行在P,然后用于SSRS报告。我没有访问P或报告的权限。我在C上运行相同的存储过程。那是我得到相同的行,但顺序不同。除了已存在的那个之外,在运行order by的商店过程中没有添加其他C子句。如果数据库具有相同的数据并且表结构也相同,为什么行会以不同的顺序出现?

编辑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

如果在上面tableACOL1PRIMARY KEY),我会select * from tableA order by COL2, COL3, COL4,然后:

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 - DB的整理有所改变

3 个答案:

答案 0 :(得分:2)

即使两个表都有相同的元数据;根据您的帖子,您可以看到您没有在查询中使用ORDER BY子句而没有使用ORDER BY;返回结果的顺序永远无法保证。

即使您在同一服务器中多次运行查询,您也可能会看到不同的数据顺序。

要确保获取特定订单,请始终使用order by clause和您的查询

select * from tableA order by some_column

答案 1 :(得分:0)

除非您为表格指定PRIMARY KEY,否则严格来说,不会定义列出数据的顺序。在MSSQL中,通常有一个“内部”顺序,对于每个表来说似乎都是可重现的,但正如您所观察到的,对于两个不同服务器上的“相同”表,这可能会有所不同。如果要在两台服务器上为表建立相同的顺序,则应该:

  • 介绍主键
  • 或始终将selectorder by
  • 一起使用

答案 2 :(得分:0)

正如其他答案所述,除非您指定order by,否则SQL Server可以并且很可能以任意顺序返回结果。实际原因是实现细节,并且取决于SQL Server在编译查询时使用的查询优化决策。

试试这个。在返回结果的查询结束时,添加查询提示option (maxdop 1)。然后尝试对两个数据库进行查询。结果是否以相同的顺序返回?

query hint forces the SQL Server optimizer to avoid parallelism。如果SQL Server为查询计算了巨大的成本,它可能会选择并行运行查询(取决于MAXDOP服务器选项和查询提示)。当查询并行运行时,不同的线程可能会在其他线程之前提供结果,并且每次运行时结果的顺序可能不同。

如果没有order by子句,查询顺序也可以取决于查询计划。影响查询计划的任何内容都会影响查询顺序。一个例子是parameter sniffing。例如,进行查询select * from [Addresses] where [Country] = 'Luxembourg'。此查询可能使用索引搜索,然后使用书签查找来返回结果,因为卢森堡的人口与地址数量相比相当小。这可能会导致按[Country]索引排序的行。

现在clear the procedure cache并尝试'select * from [Addresses] where [Country] = 'China'。此查询可能使用表扫描,因为查询返回所有列,扫描表可能比对[Country] = 'China'进行索引查找然后执行bookmark lookup更便宜。此查询可能按磁盘上数据的物理顺序排序。除非您指定order by子句,否则无法保证。

<强>更新

您提供了示例查询和架构。 order by COL2, COL3, COL4子句将保证结果按这3列排序。但是,如果这3列中存在重复值,则不保证以一致的顺序返回这些行。如果这对您很重要,则必须修改order by条款以包含主键。