You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL12相同查询条件下SELECT *与COUNT(*)结果不一致问题

PostgreSQL 12 查询结果异常修复方案

问题判定

该现象不属于SQL使用错误,也不是PostgreSQL通用功能Bug,是系统表pg_attribute的索引损坏导致的执行结果异常:

  • 不带额外过滤条件的COUNT(*)执行时走了损坏的索引扫描,返回错误的0行结果
  • 增加attname NOT ILIKE过滤条件后,执行计划切换为全表扫描,返回了实际存在的272行数据
  • 编辑器执行SELECT *返回0行,是因为编辑器默认开启了系统元组过滤规则,或是编辑器的数据库驱动调用时走了损坏的索引做结果校验

修复操作

你之前执行的普通VACUUM、重启服务无法修复索引损坏问题,按以下步骤操作:

  1. 断开所有业务侧对该数据库的访问,避免操作过程中出现数据写入冲突
  2. 执行系统表重索引命令:
-- 重索引pg_attribute系统表的所有关联索引
REINDEX TABLE pg_catalog.pg_attribute;
-- 重索引完成后执行系统表统计信息更新
VACUUM FULL ANALYZE pg_catalog.pg_attribute;
  1. 重新执行之前的4条查询验证结果一致性,如果仍然存在异常,执行全库重索引:
REINDEX DATABASE <替换为你的实际数据库名>;

注意事项

你在手动清理损坏表的残留引用前,必须先完成索引修复,避免查询结果错误导致误删正常数据。

内容的提问来源于stack exchange,提问作者Lars

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:30:04