首页 > 解决方案 > PostgreSQL 带索引的慢更新

问题描述

非常简单地更新以重置大约 500 万行的表中的 1 列:

UPDATE t_Daily 
SET Price= NULL

价格不是该表上任何索引的一部分。

在没有索引的情况下运行它需要 45 秒。

使用一个或多个索引运行它至少需要 20 分钟(我一直不得不停止它)。

我完全理解为什么维护索引会影响插入和更新语句的性能,但是这次更新对表索引没有任何改变,那么为什么它会对性能产生如此可怕的影响呢?

任何想法都非常感谢。

标签: postgresqlindexingsql-update

解决方案


这是正常的,也是意料之中的:更新索引的成本可能是更新表本身的十倍。该表没有排序!

如果price未编入索引,则可以使用避免更新索引的 HOT 更新。为了利用它,表必须定义为fillfactor小于 100,以便更新的行可以在与原始行相同的块中找到空间。


推荐阅读