Postgresql postgres索引的增量更新

Postgresql postgres索引的增量更新,postgresql,Postgresql,我在一个表中插入了大量数据,超过200万个文档,并使用GIN创建了一个全文搜索索引,效果非常好。我可以快速查询数据库和检索适当的文档 我定期收集可以插入数据库的新数据。我想做的是只使用新数据更新我的索引,但到目前为止我失败了。我不想删除索引并重新创建它,因为重新创建它需要很长时间。我基本上希望对索引进行增量更新。当插入数据时,我可以在运行中这样做,但速度非常慢。我读到在插入的数据上创建索引的速度更快,所以我猜测可以在新数据上更新索引。但到目前为止我还做不到 我使用postgresql 12 有人

我在一个表中插入了大量数据,超过200万个文档,并使用GIN创建了一个全文搜索索引,效果非常好。我可以快速查询数据库和检索适当的文档

我定期收集可以插入数据库的新数据。我想做的是只使用新数据更新我的索引,但到目前为止我失败了。我不想删除索引并重新创建它,因为重新创建它需要很长时间。我基本上希望对索引进行增量更新。当插入数据时,我可以在运行中这样做,但速度非常慢。我读到在插入的数据上创建索引的速度更快,所以我猜测可以在新数据上更新索引。但到目前为止我还做不到

我使用postgresql 12


有人能帮我吗?

加载数据时,无法暂停向索引添加值

但是GIN索引已经有了一个优化的特性:技术。 如果将存储参数设置为索引的高值。完成批量加载后,清空表以将挂起列表集成到主索引中


另一种方法是使用分区并立即加载分区。然后在分区上创建索引并将其附加到分区表。

加载数据时,无法暂停向索引添加值

但是GIN索引已经有了一个优化的特性:技术。 如果将存储参数设置为索引的高值。完成批量加载后,清空表以将挂起列表集成到主索引中


另一种方法是使用分区并立即加载分区。然后在分区上创建索引并将其附加到分区表。

非常感谢,我将尝试。非常感谢,我将尝试。只是为了确保:我使用python脚本和sqlalchemy填充数据库。然后,我修改我的表以创建tsvector类型的搜索向量并创建索引。通过运行UPDATE post SET search_vector=to_tsvectortitle | | to_tsvectorcontent;我生成了一个索引,可以用来查询我的数据库。问:当您说加载数据时将值添加到索引中,这是否意味着下次我运行python脚本加载新数据时,索引将自动更新?是的,无论您如何修改表,PostgreSQL将始终修改索引,保持所有内容的一致性。但出于性能原因,它将这些修改保存在GIN索引中的奔腾列表中,这是一种额外的溢出区域。就像图书馆里的书堆一样,这些书是最近买来的,但还没有放在正确的地方。当有人来找一本书时,你会查到合适的目录,但你也会查到一大堆新来的书。但是这个待处理的列表最终会被包括在索引中,不是吗?仅当查询在搜索过程中提交时,搜索除搜索常规索引外,还必须扫描待定项列表,导入所有数据后提交的查询将只查看常规索引。这是正确的吗?一旦待处理列表超过gin_pending_list_限制或运行真空,待处理列表将被清除,实际索引将被修改,图书馆的书籍将被上架。任何查询都会查询挂起列表,它是索引的一部分,但是如果它是空的,就没有开销。非常感谢,我将尝试一下。非常感谢,我将尝试一下。只是为了确保:我使用python脚本和sqlalchemy填充数据库。然后,我修改我的表以创建tsvector类型的搜索向量并创建索引。通过运行UPDATE post SET search_vector=to_tsvectortitle | | to_tsvectorcontent;我生成了一个索引,可以用来查询我的数据库。问:当您说加载数据时将值添加到索引中,这是否意味着下次我运行python脚本加载新数据时,索引将自动更新?是的,无论您如何修改表,PostgreSQL将始终修改索引,保持所有内容的一致性。但出于性能原因,它将这些修改保存在GIN索引中的奔腾列表中,这是一种额外的溢出区域。就像图书馆里的书堆一样,这些书是最近买来的,但还没有放在正确的地方。当有人来找一本书时,你会查到合适的目录,但你也会查到一大堆新来的书。但是这个待处理的列表最终会被包括在索引中,不是吗?仅当查询在搜索过程中提交时,搜索除搜索常规索引外,还必须扫描待定项列表,导入所有数据后提交的查询将只查看常规索引。对吗?一旦待处理列表超过gin_待处理列表限制或 运行真空,清除待处理列表,修改实际索引,然后将图书馆的书籍放到书架上。任何查询都将始终查询挂起列表,因为它是索引的一部分,但如果它为空,则没有开销。