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

PostgreSQL是否会在条件不满足时从部分索引中移除对应值?

PostgreSQL部分索引的维护与空间回收问题

1. 标记为is_deleted=true的行会被自动从部分索引移除吗?

会的。当你更新invoice表中50%的行,将is_deleted设为true时,PostgreSQL会实时维护部分索引:只要行的变更导致它不再满足索引的过滤条件(WHERE NOT "is_deleted"),数据库就会自动把这些行从idx_invoice_account_id索引中移除,不需要手动执行额外操作。

2. 回收索引空闲空间的方式,REINDEX是唯一的吗?

不是唯一的。虽然索引里已经没有这些被标记为删除的行,但索引文件的物理大小不会立刻缩小——PostgreSQL会保留这些空闲空间,供后续符合索引条件的新行插入使用。如果需要主动回收这些空闲空间,除了REINDEX,还有以下两种常用方式:

  • VACUUM FULL:它会重写整个表及关联索引,彻底回收空闲空间,但执行过程中会锁表,适合业务低峰期操作。
  • 分区表方案:如果invoice表是分区表,可以将标记为is_deleted=true的行迁移到单独的分区,然后 detach 该分区并删除,这种方式锁表时间短,适合处理大量数据的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 09:39:52