【问题标题】:PostgreSQL slow update with indexPostgreSQL 带索引的慢更新
【发布时间】:2019-04-17 10:46:33
【问题描述】:

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

UPDATE t_Daily 
SET Price= NULL

价格不属于该表的任何索引。

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

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

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

非常感谢任何想法。

【问题讨论】:

标签: postgresql indexing sql-update


【解决方案1】:

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

如果price 没有被索引,您可以使用避免更新索引的热更新。为了利用这一点,必须使用小于 100 的 fillfactor 定义表,以便更新的行可以在与原始行相同的块中找到空间。

【讨论】:

    【解决方案2】:

    找到更多信息(感谢 Laurenz-Albe 提供的 HOT 提示)。

    此链接https://malisper.me/postgres-heap-only-tuples/ 指出

    由于 MVCC,Postgres 中的更新包括查找正在更新的行,并将该行的新版本插入回数据库中。这样做的主要缺点是需要将行读取到每个索引

    因此,尽管只更新了不在索引中的列,但它正在重写索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多