PostgreSQL12相同查询条件下SELECT *与COUNT(*)结果不一致问题
PostgreSQL 12 查询结果异常修复方案
问题判定
该现象不属于SQL使用错误,也不是PostgreSQL通用功能Bug,是系统表pg_attribute的索引损坏导致的执行结果异常:
- 不带额外过滤条件的
COUNT(*)执行时走了损坏的索引扫描,返回错误的0行结果 - 增加
attname NOT ILIKE过滤条件后,执行计划切换为全表扫描,返回了实际存在的272行数据 - 编辑器执行
SELECT *返回0行,是因为编辑器默认开启了系统元组过滤规则,或是编辑器的数据库驱动调用时走了损坏的索引做结果校验
修复操作
你之前执行的普通VACUUM、重启服务无法修复索引损坏问题,按以下步骤操作:
- 断开所有业务侧对该数据库的访问,避免操作过程中出现数据写入冲突
- 执行系统表重索引命令:
-- 重索引pg_attribute系统表的所有关联索引 REINDEX TABLE pg_catalog.pg_attribute; -- 重索引完成后执行系统表统计信息更新 VACUUM FULL ANALYZE pg_catalog.pg_attribute;
- 重新执行之前的4条查询验证结果一致性,如果仍然存在异常,执行全库重索引:
REINDEX DATABASE <替换为你的实际数据库名>;
注意事项
你在手动清理损坏表的残留引用前,必须先完成索引修复,避免查询结果错误导致误删正常数据。
内容的提问来源于stack exchange,提问作者Lars
相关产品推荐
相关产品推荐

