PostgreSQL函数变更后,基于函数的索引是否自动更新?
PostgreSQL中依赖函数的索引在函数变更后是否自动更新?
答案是:不会自动更新,必须手动重建索引才能保证查询结果正确且索引有效。
结合你的示例场景分析:
- 初始阶段你创建的
add_test_prefix函数返回test_拼接输入文本,基于它创建的idx_test_prefix索引中,存储的是所有username经过旧函数计算后的test_xxx格式值。 - 当你修改函数逻辑,让它返回
newprefix_拼接输入文本后,索引里的旧值不会同步更新——索引仍然保留着之前计算的test_xxx结果。
这时候如果直接执行SELECT * FROM users WHERE add_test_prefix(username) = 'newprefix_jon',会出现两种问题:
- 若数据库尝试使用索引,会因为索引中的旧值与新函数计算结果不匹配,无法查到正确的数据;
- 若数据库放弃使用索引转而全表扫描,虽然能得到正确结果,但完全失去了索引的性能优势。
解决办法:
手动重建索引,让索引重新计算并存储新函数逻辑下的结果:
REINDEX INDEX idx_test_prefix;
或者删除原索引后重新创建,效果一致:
DROP INDEX idx_test_prefix; CREATE INDEX idx_test_prefix ON users ((add_test_prefix(username)));
补充说明:
PostgreSQL不会自动追踪并更新所有依赖变更函数的对象,函数的DDL变更操作不会触发关联索引的自动重建。这需要用户主动维护依赖对象的一致性,避免出现索引数据与实际函数逻辑不匹配的问题。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

