4

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

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

4

2 回答 2

4

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

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

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

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

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

于 2013-05-01T00:15:37.813 回答
1

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

于 2013-05-01T00:19:48.833 回答