如果未定义order by子句,则distinct选择中的第一列是默认顺序

时间:2013-04-30 23:51:30

标签: sql-server tsql distinct

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

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

2 个答案:

答案 0 :(得分:4)

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

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

依赖某些操作的副作用是一种坏习惯。想想观点:很长一段时间,你被允许将ORDER BY置于一个视图中,并且它有效,即使它永远不应该被依赖。然后,人们升级了他们的SQL Server数据库并发现 - 哎呀 - 不再支持旧的行为。我使用SQL 2000数据库,在升级到SQL 2005并更改兼容模式后,前端的几个数据表不再排序 - 哎呀。

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

做得对。添加ORDER BY。不要再推测将会或可能或应该发生的事情。或者什么不会或不会或不应该。

答案 1 :(得分:1)

使用DISTINCT检查查询的执行计划可确认您的观察结果。