Postgres 列太大而无法清除
Postgres column too big to clear out
不到 2 小时前,我注意到我的代码中存在一个大问题。由于意外的无限循环,我在数据库中的一列 List.keywords
中填充了一段巨大的文本。一切都被阻止了。
当我意识到这个错误时,我更改了我的代码以在每次保存记录时清空该列。一切都在阻塞。
我尝试使用 rails 迁移 remove_column :lists, :keywords
来迁移数据库。迁移也失败了。
虽然最后一次迁移一定做了一些事情,但现在代码又快了。除了 Lists
(keywords
列给了我问题)。保存 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 应用程序再次开始快速运行,没有任何堵塞。
希望这对以后的人有所帮助。应该是我吧。
不到 2 小时前,我注意到我的代码中存在一个大问题。由于意外的无限循环,我在数据库中的一列 List.keywords
中填充了一段巨大的文本。一切都被阻止了。
当我意识到这个错误时,我更改了我的代码以在每次保存记录时清空该列。一切都在阻塞。
我尝试使用 rails 迁移 remove_column :lists, :keywords
来迁移数据库。迁移也失败了。
虽然最后一次迁移一定做了一些事情,但现在代码又快了。除了 Lists
(keywords
列给了我问题)。保存 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 应用程序再次开始快速运行,没有任何堵塞。
希望这对以后的人有所帮助。应该是我吧。