我的理解是,不能保证选择总是返回相同的结果。
以下查询不保证每次都返回相同的结果:
select * from myTable offset 10000 limit 100
我的问题是,如果在执行select(没有删除或插入)之间没有更改myTable,我可以依赖它每次返回相同的结果集吗?
或者,如果我的数据库被锁定以进行更改,那么我可以依赖于select返回相同的结果吗?
我正在使用postgresql。
答案 0 :(得分:3)
表和结果集(没有order by
)根本没有订购。真的很简单。
在某些数据库中,在某些情况下,订单将保持一致。但是,你应该从不依赖于此。例如,后续版本可能会使查询无效。
对我而言,我认为理解这一点的最简单方法是考虑并行处理。执行查询时,不同的线程可能会熄灭并开始获取数据;首先返回哪些值取决于不可重现的因素。
考虑它的另一种方法是考虑已经在内存中有页面的页面缓存 - 可能来自表的末尾。 SQL引擎可以按任何顺序读取页面(虽然实际上并没有真正发生这种情况)。
或者,某些其他查询可能有行或页锁定,因此在读取记录时会跳过该页面。
所以,接受无序意味着有序意味着什么。如果您想要特定订单中的数据,请添加order by
。如果使用聚簇索引键,则基本上没有性能损失。