Postgres列表分区表体积增长但查询无返回数据问题咨询
问题解答
你提供的LIST分区建表语法本身符合PostgreSQL规范,不存在逻辑错误。出现写入后表体积增长但查询无结果的情况,可从以下几个方向排查:
- 查询时误用
ONLY关键字:如果执行查询时加了ONLY修饰符(SELECT * FROM ONLY table1;),PostgreSQL只会查询主表本身,不会遍历关联所有分区,而分区表的主表默认不存储任何实际数据,就会返回空结果。正常查询直接执行SELECT * FROM table1;即可自动拉取所有分区的数据。 - 插入事务未提交或已回滚:PostgreSQL的写入操作会先写入WAL日志和数据文件,即使事务还没提交,磁盘占用也会同步上涨。如果插入操作所在的事务始终没有执行
COMMIT,或者中途执行了ROLLBACK,所有会话都无法查询到这部分数据。回滚后占用的磁盘空间不会立刻释放,只会被标记为可复用,因此会出现表体积上涨但无数据返回的现象。 - 写入操作被静默拦截:默认情况下插入
t_type字段值不在('xval1','xval2','yval1','yval2')范围内的数据会直接报错,但如果你的写入语句加了ON CONFLICT DO NOTHING、表上配置了跳过非法写入的触发器、或创建了DEFAULT分区同时配置了自动清理数据的规则,都会出现写入请求执行成功但实际无有效数据入库的情况。 - 行级安全策略(RLS)限制:如果该表开启了行级安全策略,且你当前使用的数据库用户没有对应的数据查询权限,PostgreSQL会直接过滤所有返回结果,表现为查询无返回,但实际数据已经写入磁盘,表体积正常上涨。你可以执行
ALTER TABLE table1 DISABLE ROW LEVEL SECURITY;临时关闭RLS验证是否是该问题。 - 事务隔离级别限制:如果你在查询会话中先开启了可重复读(REPEATABLE READ)或者更高隔离级别的事务,之后才在其他会话执行插入并提交,你在旧的事务中无法查询到新插入的数据,结束当前事务重新查询即可看到结果。
内容的提问来源于stack exchange,提问作者user3620475
相关产品推荐
相关产品推荐

