【问题标题】:Mssql query sequence is changing every timemssql查询顺序每次都在变化
【发布时间】:2021-02-17 07:39:58
【问题描述】:

对于 Erp 版本升级,我们复制了数据库并恢复到新的。我们改变了桌子。 (添加新列或更改宽度等。我们删除索引并重新创建)。毕竟我们测试了新数据库,遇到了这样的情况。

我们有一个类似的查询

select top 5 * from table. 

旧数据库:当我们连续运行查询时,结果顺序不会改变

新数据库:当我们运行时,结果的顺序发生变化。

我认为存在聚集索引问题,但我不知道如何确定和解决它。有什么帮助吗?

【问题讨论】:

  • 您的查询没有order by,因此您的结果中没有保证顺序。保证特定排序顺序的唯一方法是使用order by
  • 但是旧的数据库总是一样的
  • 那你很幸运。 唯一保证特定排序顺序的方法是使用order by
  • 请参考文档docs.microsoft.com/en-us/sql/t-sql/queries/…The order in which rows are returned in a result set are not guaranteed unless an ORDER BY clause is specified.
  • 你在 sql (和咨询)中学到了一个不幸和可怕的教训。你的代码有很大的缺陷,现在这个改变暴露了其中一个缺陷。您必须修复您的代码,并且安全的假设是还有其他缺陷等待被发现。

标签: sql sql-server sql-order-by


【解决方案1】:

除非您使用 order by,否则无法保证订单。

旧数据库可能在表上创建了聚集索引。请检查一下。但即使是聚簇索引也不一定能保证排序。

【讨论】:

    【解决方案2】:

    如果您在 TOP 语句之后不使用 ORDER BY 语句,则数据库引擎不保证结果集的顺序。 SQL Server 在某些情况下希望快速返回合格的行,这种机制称为Row Goals,很可能您的查询执行计划使用这种机制。另一方面,聚集索引运算符包含一个 ordered 属性,这向我们展示了检索到的行是否以有序方式获取。

    【讨论】:

      猜你喜欢
      • 2011-10-11
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 2019-05-19
      • 2013-09-27
      • 2013-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多