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
相关产品推荐
相关产品推荐

