sql-server - 如果未定义 order by 子句,则不同选择中的第一列是默认顺序

标签 sql-server tsql distinct

在工作时,我只是注意到 SQL Server 的顺序是第一列,选择列表中的第二列,当它具有不同的并且不是按照随机顺序或按顺序创建记录时。

任何人都可以确认自己的经验吗?

最佳答案

如果Distinct Sort运算符是查询执行计划中的最后一个,那么最终顺序将按列顺序排列似乎是一个合理的假设。但是,如果您真的希望以某种方式对它们进行排序,则不应依赖此假设。您应该明确添加 ORDER BY条款。冒着事情不正确的风险来获得潜在的小性能提升是不值得的。还有其他运算符可以确保 DISTINCTness,例如聚合。你确定它会排序吗?

嘿,如果引擎变得足够聪明,可以确定返回的行已经是不同的并且不需要做任何进一步的事情(例如排序或任何类型的聚合或其他流来丢弃重复的行)怎么办?这可能相当容易,具体取决于是否包含(全部)基础表中的主键列或唯一列。例如,如果您在 OrderID 上有一个聚集索引, 任何包含 OrderID 的查询值不可能被重复的地方,已经可以证明是不同的!

依赖某些操作的副作用是一个坏习惯。想想意见:很长一段时间,你被允许放ORDER BY从某种意义上说,它奏效了,即使它不应该被依赖。然后,人们升级了他们的 SQL Server 数据库并发现——糟糕——旧的行为不再受支持。我使用的是 SQL 2000 数据库,在升级到 SQL 2005 并更改兼容模式后,前端的几个数据表不再排序--哎呀。

并考虑并行性——这将任务分解为更小的部分。并行性已经被证明可以打破 Scope_Identity()在某些情况下,在某些版本的 SQL Server 中。如果一个工作线程在另一个工作线程之前完成,它的结果可能会在其他线程完成之前流式传输到客户端——从而突然改变顺序。

做对了。添加 ORDER BY .不要再猜测会发生什么或可能发生什么或应该发生什么。或者什么不会或不能或不应该。

关于sql-server - 如果未定义 order by 子句,则不同选择中的第一列是默认顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16310763/

相关文章:

mysql - 使用sql查找源和最终目的地

sql - 建立2个表之间的一对多关系

c# - 如何只同步数据库中的某些行

php - Laravel 到 SQL Server (sqlsrv)。 [PDOException] 找不到驱动程序

sql - 使用 sp_executesql 在不执行查询的情况下计算查询结果

sql - 如何在没有联合条款的情况下进行优化?

sql - 获取具有 max(timestamp) 的行

mysql - 在没有主键的情况下删除 MySQL 数据库中的重复条目

c# - 自动增量(身份)在 Fluent NHibernate 中不起作用

sql-server - 使用动态 Sql 创建 View