日期:2014-05-16  浏览次数:20789 次

关于SQL Distinct默认结果集排序的探讨?
本帖最后由 hi_web 于 2014-04-11 11:34:58 编辑
软件环境:

系统信息:

执行查询语句 select Distinct  UserID,UserName,UseMonth from TableName,同一数据库备份在两台机器上运行结果集顺序不一致。请各位大牛指点,Distinct  不加排序字段执行查询,结果集默认的顺序应该是什么,影响结果集顺序的因素都有哪些?

------解决方案--------------------
实事求是的讲,就现在我遇到的情况,如果distinct 不写order by 的话,实际结果集的输出顺序依赖于两个条件。 
1、生成的查询计划的顺序(在不同版本的sql server 解释同一个语句的执行计划会有所不同,统计信息不同也会有所不同)
2、数据存储和访问的顺序 (这个要看是否有索引等)

还是需要具体情况,具体分析的。
个人愚见,参考

------解决方案--------------------
没有order by子句的所有查询都不保证顺序,即使有聚集索引
------解决方案--------------------
因为优化器可能会选择并行处理,或者在多文件情况下不按“期待”顺序扫描数据,所以无法保证数据的顺序。唯一能确保顺序的只有order by。distinct内置是需要排序然后去重的,但是最终结果可能又会乱掉。另外根据sqlserver排序规则,不同的排序规则也有不同的结果