【问题标题】:Wrong working b tree index in postgrespostgres中错误的工作b树索引
【发布时间】:2025-12-16 20:55:03
【问题描述】:

最近,我在表中的一列上遇到了 b 树索引的问题。我创建索引:

CREATE INDEX t_client_contact_email on t_client_contakt (email);

一切正常,但几天后,使用此索引进行搜索无法正常工作。重建这个索引(DROP - CREATE)everytning 就可以了。

我能用这个做什么?我正在使用 Postgres 8.4。

【问题讨论】:

  • 不,有任何错误。但是,如果我搜索示例字符串(邮件) - example@whatever.com 并将其放在表中,我不会收到任何查询。例如:SELECT * FROM t_client_contact WHERE email = 'example@whatever.com' 我没有收到任何查询(但我在表格中有这封电子邮件)
  • 日志中也没有错误消息?你能重现这个问题吗?导致失败的具体操作列表是什么?
  • 不,在日志中我没有任何错误,只是正确执行了语句。这个错误在我创建索引几天后重现,但是当我再次删除并创建索引时,一切正常......几天。
  • 您运行的是哪个版本的 pg?您可以更新到最新的 8.4.x 并重试吗?

标签: sql postgresql indexing b-tree


【解决方案1】:

您可能会被一个最近修复的旧错误所困扰。

看这个:

http://www.postgresql.org/docs/8.4/static/release-8-4-11.html

具体来说:

修复与清理同时进行的插入导致的 btree 索引损坏 (Tom Lane)

由插入引起的索引页面拆分有时会导致并发运行的 VACUUM 错过删除它应该删除的索引条目。删除相应的表行后,悬空的索引条目会导致错误(例如“无法读取文件中的块N ...”)或更糟的是,在将不相关的行重新插入到 now-free 后,查询结果会静默错误表位置。此错误自 8.2 版以来一直存在,但发生频率如此之低,以至于直到现在才被诊断出来。如果您有理由怀疑它已在您的数据库中发生,重新索引受影响的索引将解决问题。

【讨论】: