Postgres 列太大而无法清除

Postgres column too big to clear out

不到 2 小时前,我注意到我的代码中存在一个大问题。由于意外的无限循环,我在数据库中的一列 List.keywords 中填充了一段巨大的文本。一切都被阻止了。

当我意识到这个错误时,我更改了我的代码以在每次保存记录时清空该列。一切都在阻塞。

我尝试使用 rails 迁移 remove_column :lists, :keywords 来迁移数据库。迁移也失败了。

虽然最后一次迁移一定做了一些事情,但现在代码又快了。除了 Listskeywords 列给了我问题)。保存 List 时,大约需要 5 秒。读起来很快。

如果我 heroku pg:psql 并查看列表 table,keywords 列仍然存在,所以我猜这就是所有数据仍然存在的地方以及为什么table 太慢了。

你们会如何解决这个问题?

问题是调用 List 记录会尝试将此记录加载到内存中。该列是如此之大,以至于即使这样也会在 Rails.

中失败

与 Postgres 工程师交谈后我的决定:

我使用 heroku pg:psql -a <myapp> 在 heroku 上登录了我的 postgres 生产控制台。我查看了 List 2203

的值
SELECT "keywords"
FROM "lists"
WHERE id = 2203;

我看到里面有一大段文字,非常高兴,因为这是我第一次真正看到问题所在。首先我想清除 this list

-- Doing this in a transaction, so if I don't like what happened, I can call ROLLBACK; to start over
BEGIN;
UPDATE "lists"
WHERE id = 2203
SET keywords = '';

SELECT "keywords"
FROM "lists"
WHERE id = 2203;

-- I was happy with the result as it was empty, so I committed the transaction
COMMIT;
-- If you're not happy, do ROLLBACK; to start over

好的,这是一个 List 完成,是时候完成所有这些了

-- not setting the WHERE as I want to do this on all of them.
BEGIN;
UPDATE "lists"
SET keywords = '';

-- here you can SELECT to do some checks at some records, see if they are empty.

COMMIT;

瞧,我的 Rails 应用程序再次开始快速运行,没有任何堵塞。

希望这对以后的人有所帮助。应该是我吧。