Select 没有订单

Select without order by

据我了解,select 不能保证总是 return 相同的结果。

不保证以下查询每次都return相同的结果:

select * from myTable offset 10000 limit 100

我的问题是,如果 myTable 在 select 的执行之间没有改变(没有删除或插入),我可以依赖它吗?return 每次都使用相同的结果集?

或者换句话说,如果我的数据库因更改而被锁定,我可以依靠 select return 得到相同的结果吗?

我正在使用 postgresql。

表和结果集(没有 order by)根本没有排序。真的就是这么简单。

在某些数据库中,在某些情况下,顺序会保持一致。但是,您应该 永远不会 依赖于此。例如,后续版本可能会使查询无效。

对我来说,我认为理解这一点的最简单方法是考虑并行处理。当您执行查询时,不同的线程可能会退出并开始获取数据;首先返回哪些值取决于不可重现的因素。

另一种思考方式是考虑内存中已有页面的页面缓存——可能从 table 末尾开始。 SQL 引擎可以按任何顺序读取页面(尽管实际上这并没有发生)。

或者,某些其他查询可能具有行或页锁,因此在读取记录时会跳过该页。

因此,请接受无序意味着有序。如果您想要特定顺序的数据,请添加 order by。如果使用聚集索引键,那么基本上不会影响性能。