postgreSQL/kingbase limit分页查询,结果乱序

现象

我使用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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值