PostgreSQL添加新列后查询返回不同记录集的原因排查
为什么添加state列后,PostgreSQL查询返回的记录集完全不同?
这是因为PostgreSQL在没有指定ORDER BY子句时,查询返回的行顺序是不确定的,数据库会根据执行效率选择最优的执行计划,不同的查询可能触发不同的执行计划,导致返回顺序不一样,进而让LIMIT + OFFSET取出的行完全不同。
具体到你的场景:
- 第一个查询只选取
id列,PostgreSQL可能直接使用id列的索引快速获取数据,返回的是索引里的id顺序。 - 第二个查询需要同时返回
id和state列,如果没有覆盖这两个列的复合索引,数据库可能会选择全表扫描,或者其他能同时获取这两列数据的执行路径,这时候返回的行顺序就和索引扫描的顺序完全不同。
要解决这个问题,必须给查询加上明确的ORDER BY子句,比如:
select id from vehicles order by id limit 5 offset 45; select id, state from vehicles order by id limit 5 offset 45;
这样不管查询哪些列,只要排序规则一致,LIMIT + OFFSET取出的行就会保持一致。
内容的提问来源于stack exchange,提问作者shajin
相关产品推荐
相关产品推荐

