postgres/kingbase limit分页查询,结果乱序
- 现象
- 排查
- 总结解决办法
- 1.session中关闭synchronize_seqscans
- 2.查询时带上order by
现象
我使用kingbase8,使用select * from xx limit 0,1000
每次查出来的结果都不一样。
排查
1.由于kingbase的文档较少,直接搜索posggreSQL+limit+乱序,一番简单搜索后,发现为什么PostgreSQL使用LIMIT关键字进行查询时,返回的结果是乱序的?文章中提到的现象跟我一样。原因是没有使用order by。 我给加上order by 后,确实能稳定排序了,但是我的表不确定,不一定有索引,也不一定有主键,因此oder by就不太适合。
2.文章提到synchronize_seqscans
参数,去官方文档看了下,主要是为了提高并发查询效率的。8.3后默认开启的。
synchronize_seqscans (boolean)
它允许对大型表的顺序扫描与其他扫描同步,因此并发扫描可以在几乎相同的时刻读取相同的块,这样可以分担 I/O 负载。当启用这个参数时,一个扫描可能会从表的中间开始并且之后“绕回”到开头以覆盖所有的行,这样可以与已在进行中的扫描活动同步。对于没有ORDER BY子句的查询来,这样的扫描会在返回行的顺序中造成不可预料的改变。将这个参数设置为off以保证 8.3 之前的行为(顺序扫描总是从表的起始处开始)。默认值是on。
3.那么看来能关闭的。不过我无法去设置业务里面的数据库的参数。遂思考能不能在session级别关闭synchronize_seqscans
参数。
4.查到参数的上下文是user,看样子是可以在session级别设置。然后通过chatgpt找到了查询参数/设置参数的语句。
总结解决办法
1.session中关闭synchronize_seqscans
# 查询参数当前状态
show synchronize_seqscans
#设置参数为false
set synchronize_seqscans=false
2.查询时带上order by
select * from xx oder by id asc limit 0,1000