Postgres tsvector_update_trigger有时需要几分钟

时间:2013-08-01 01:18:02

标签: performance postgresql tsvector

我在postgres数据库中的表上配置了自由文本搜索。非常简单的东西,有名字,姓氏和电子邮件。这种方法效果很好而且很快。

但是,我有时会在向表中插入新条目时遇到looong延迟,其中insert继续运行几分钟,并且还生成大量WAL文件。 (我们使用WAL文件进行复制)。

我的自由文本索引有什么需要注意的吗?像Postgres可能会出于性能原因随机重组它?我的索引目前大约400 MB。

提前致谢!

基督教

1 个答案:

答案 0 :(得分:1)

考虑到WAL文件的大小,我怀疑你是正确的,它是导致问题的索引更新/重新平衡。但是我不得不想知道还有什么。

我建议不要在单独的列中存储tsvectors。更好的方法是在to_tsvector()的输出上运行索引。如果需要,您可以为多种语言提供多个索引。因此,我不建议采用一个名为描述的字段并将tsvector存储在desc_tsvector中,而是建议只做:

 CREATE INDEX mytable_description_tsvector_idx ON mytable(to_tsvector(description));

现在,如果您需要在整个表中使用一致的搜索界面,那么使用“表格方法”有更优雅的方法。

一般而言,功能索引方法与其相关的问题少于其他任何问题。

现在你需要注意的第二件事是部分索引。如果需要,您只能索引感兴趣的记录。例如,如果我的大多数查询只检查去年,我可以:

 CREATE INDEX mytable_description_tsvector_idx ON mytable(to_tsvector(description))
  WHERE created_at > now() - '1 year'::interval;