【问题标题】:Why does SQL Server 2000 behave differently than SQL Server 2008 in the absence of an ORDER BY clause?为什么在没有 ORDER BY 子句的情况下,SQL Server 2000 的行为与 SQL Server 2008 不同?
【发布时间】:2012-12-08 20:46:12
【问题描述】:

我们使用的是 SQL Server 2008 R2。我们有一个名为 PD(6 列)的表,它没有主键,并且在任何列上都没有索引。当我们执行查询时

select * from PD where ESE='bycad'

如果没有 ORDER BY 子句,每次执行相同的查询时,我们都会以不同的顺序获得结果。直到两个月前,我们才使用 SQL Server 2000,从未遇到过这个问题。

这是 SQL Server 2008 中的错误吗?我知道我们应该使用 ORDER BY 子句,但是为什么 SQL Server 2008 对没有 ORDER BY 子句的 SQL 查询的处理方式不同?

【问题讨论】:

  • 如果订单很重要,请使用ORDER BY。这对任何 rdbms 和版本都有效。
  • 您没有使用ORDER BY,然后称缺少订购错误?!?!??? Sql 2000 不必要的排序是错误。
  • 但是为什么 sql 2000 和 2008 的差异.. sql 2000 以相同的顺序多次执行结果集。 !!!

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


【解决方案1】:

任何来自 SQL Server 的结果集都是一个集合。集合没有固有的顺序。

除非指定了“ORDER BY”,否则从选择语句返回的行从来没有任何顺序保证。 (对于任何 rdbms 都是如此,不仅是 SQL Server)

编辑: 要回答您的问题,您在每次执行时看到不同顺序的原因很可能是由表的并行扫描“引起”的。你也买了新的硬件吗?但同样,如果您需要排序结果,则需要指定“ORDER BY”。

【讨论】:

  • 谢谢,但是为什么 sql 2000 总是以相同的顺序给出结果集??? support.microsoft.com/kb/981502 这个链接是错误的证明吗??? (因为在错误中它被称为不同的结果集)
  • 如果您提交一个简单的查询,SQL Server 很可能会按分配顺序读取数据。如果查询也仅限于单个线程,则数据很有可能始终以相同的顺序返回。但是,这可能会受到同时运行的其他查询的影响。当查询并行执行时,不同的线程每次读取表的不同部分,导致每次输出顺序不同。
  • 您引用的错误报告谈论的是不同的结果,而不是每次执行的不同顺序。除非明确要求,否则无法保证订单。从来没有过,也永远不会有。如果您的查询表现得像以前订购的那样,那只意味着您很幸运。即使在带有静态数据的单核 SQL 2000 中,您最终也可以在适当的情况下更改结果顺序。
  • 非常感谢塞巴斯蒂安!强调链接是因为我们使用经典的 asp 来访问 sql server(2000 和 2008 年)。当用户尝试访问表时,查询是动态形成的。现在,如果用户没有指定,我将按照 incase 进行默认顺序明确
猜你喜欢
  • 2018-10-04
  • 2022-07-04
  • 1970-01-01
  • 2018-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
相关资源
最近更新 更多