Heroku Rails 控制台中的大型 'create' 循环操作失败
Large 'create' loop operation failing in Heroku Rails console
我正在尝试将一些与统计相关的列移出我的 Article 模型并创建名为 Statistics 的子 类,它通过 has_many
关系包含相同的信息。但是,我有很多需要创建的记录,当 运行 在 Rails 控制台中通过 heroku run rails c
:
时,我当前的方法在一小时后超时
Article.where("stats_count IS NOT NULL").each do |c|
s = Statistic.new(
:dimension => "total_count",
:metric => c.stats_count,
:article_id => c.id )
s.save
end
在开发中工作,但在生产中 运行 有大约 90,000 篇文章正在尝试循环,但在创建大约 8,500 个统计信息后失败了。
执行这种规模的操作的最佳实践方法是什么(我不介意停机,如果我知道它会起作用的话)?
有可能 运行 您在独立的一次性测功机上编写代码会绕过超时,但在我看来,您最好在数据库级别执行此操作。
来自 psql 控制台 (heroku pg:psql)
INSERT INTO statistics (dimension, metric, article_id)
SELECT 'total_count', stats_count, id
FROM articles
WHERE stats_count IS NOT NULL;
这将比 ruby 循环快几个数量级。
我正在尝试将一些与统计相关的列移出我的 Article 模型并创建名为 Statistics 的子 类,它通过 has_many
关系包含相同的信息。但是,我有很多需要创建的记录,当 运行 在 Rails 控制台中通过 heroku run rails c
:
Article.where("stats_count IS NOT NULL").each do |c|
s = Statistic.new(
:dimension => "total_count",
:metric => c.stats_count,
:article_id => c.id )
s.save
end
在开发中工作,但在生产中 运行 有大约 90,000 篇文章正在尝试循环,但在创建大约 8,500 个统计信息后失败了。
执行这种规模的操作的最佳实践方法是什么(我不介意停机,如果我知道它会起作用的话)?
有可能 运行 您在独立的一次性测功机上编写代码会绕过超时,但在我看来,您最好在数据库级别执行此操作。
来自 psql 控制台 (heroku pg:psql)
INSERT INTO statistics (dimension, metric, article_id)
SELECT 'total_count', stats_count, id
FROM articles
WHERE stats_count IS NOT NULL;
这将比 ruby 循环快几个数量级。