MS SQL无ORDER BY子句的SELECT查询是否按插入顺序返回结果?
MS SQL 无ORDER BY子句的查询结果顺序说明
不带ORDER BY的SELECT查询,完全不保证按插入顺序返回结果,你目前测试符合预期只是特定场景下的巧合,不存在任何官方支撑该假设成立,绝对不能用这个方式判断行的插入先后。
具体原因
- 结果返回顺序由查询优化器选择的执行计划决定,和插入顺序没有绑定关系,常见会改变顺序的场景包括:
- 表存在聚集索引时,无排序查询默认走聚集索引扫描,返回顺序和聚集索引键顺序一致,和插入顺序无关
- 如果查询涉及的字段被某非聚集索引覆盖,优化器会优先走该非聚集索引,返回顺序就是非聚集索引的键排序
- 数据量变大触发并行查询、并发写入导致页拆分、索引重建、数据库版本升级等任意因素,都可能改变执行计划,直接打乱你之前观测到的返回顺序
- 要可靠判断两行的插入先后,只能用两种方案:
- 表新增插入时间列,设置默认值为
GETDATE()/SYSUTCDATETIME(),插入时自动记录时间戳,后续直接比较该字段即可 - 表设置自增
IDENTITY主键,自增ID的生成顺序和插入顺序严格对应,比较ID大小即可判断插入先后
- 表新增插入时间列,设置默认值为
微软官方文档明确约定:仅当查询显式声明ORDER BY子句时,SQL Server才会保证结果集的行顺序,所有无排序的查询返回顺序都不具备稳定性和可预测性。
内容的提问来源于stack exchange,提问作者sharkyenergy
相关产品推荐
相关产品推荐

