大更新后查找单个 PostgreSQL table 突然非常慢

Lookups in for single PostgreSQL table suddenly extremely slow after large update

我有一个 messages table 里面有几百万条记录。我的 Rails 应用程序在大多数页面上都包含一个查询,用于计算未读 messages 的数量以显示给用户。此查询 - 以及 messages table 的所有查询 - 没有变化,直到昨天都运行良好。

昨天,我创建了一个新的 messages 列和 运行 update_all 来更新我的几百万 messages 条记录中的每条新列。很简单,我以前做过很多次,尽管记录数量较少。

但是,现在每次查询 COUNT 或 SELECT messages 都需要 30 多秒才能到达 return。在迁移和 update_all 之前,执行 COUNT 或 SELECT 只需要 100 毫秒左右。

我已经尝试了很多方法,但查询速度仍然非常慢。我试过 REINDEX messages 也试过 VACCUM messages 但都没有太大帮助。

数据库的其余部分 table 仍像往常一样工作,但 messages table 的这个问题使所有内容 运行 都无法正常工作。有谁知道为什么会发生这种情况,还有什么我可以尝试解决的吗?

I've tried to REINDEX messages and I've tried to VACCUM messages but neither helped significantly.

您错过了重要的 ANALYZE。可能是 VACUUM ANALYZE 的形式。 (不过通常 autovacuum 应该会处理这个问题!)

更新所有行会在物理关系中创建尽可能多的死元组。腾出时间 space,这可能是难得的

VACUUM FULL ANALYZE messages;

在 table 上取得独占锁!并且由于您 运行 对每个用户 计数很多 ,您不妨使用 CLUSTER:

CLUSTER messages USING that_index_sorting_by_user_id_and_the_read_flag

对于每个用户的快速计数,无论哪种方式,适当的(多列)索引都是关键。取决于未公开的架构和查询。

话虽如此,您不应该看到如此显着的性能下降。也许你耗尽了资源。就像,只是没有足够的 RAM 来缓存更大的索引。