【问题标题】:Create millions of records for ActiveRecord test为 ActiveRecord 测试创建数百万条记录
【发布时间】:2012-09-06 21:18:21
【问题描述】:

在 Ruby 中,我有一个测试,它是 ActiveSupport::TestCase 的子类,并通过 Postgres(实际上是 Greenplum)数据库中的 ActiveRecord 子类访问表。对于一个特定的测试,我需要用大约一百万行来填充表格,但我并不关心里面有什么。我可以做类似的事情

for i in 1...1000000 do
  MyTable.create(:column1 => 'value', :column2 => 'value')
end

但这需要很长时间才能运行。我可以通过将它包装在一个事务中来让它更快一点,这样create 就不会每次都创建一个新的,但这只会节省很多时间。

有什么好方法可以做到这一点,这样我就不必在表中执行大量虚假值的插入?

(注意:试图假装表包含一百万条记录是行不通的,因为我稍后需要与实际的行进行交互;对于这个特定的测试,我只是不在乎它们是什么)

【问题讨论】:

  • 如果你可以使用原始 SQL,你可以使用这个:postgresql.org/docs/9.0/static/…
  • 使用for 是一种反模式。它只是调用each,因此更有意义(并遵循OO 模式)执行(1...1000000).each do ... end。或者更简单的是1000000.times do ... end

标签: ruby postgresql activerecord greenplum


【解决方案1】:

在一个简单的查询中运行所有这些,例如:

INSERT INTO mytable (col1, col2) 
SELECT 'value1', 'value2' 
FROM generate_series(1,1000000);

这应该会很快填充数据库。我的笔记本电脑需要 2 秒。

【讨论】:

  • generate_series 万岁!这是一个非常有用的 PostgreSQL 功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-21
  • 2019-09-16
  • 1970-01-01
  • 2023-01-31
  • 2016-03-06
  • 1970-01-01
相关资源
最近更新 更多