Read more

ActiveRecord: Creating many records works faster in a transaction

Henning Koch
March 17, 2011Software engineer at makandra GmbH

When you need to insert many records into the same table, performance may become an issue.

Illustration web development

Do you need DevOps-experts?

Your development team has a full backlog? No time for infrastructure architecture? Our DevOps team is ready to support you!

  • We build reliable cloud solutions with Infrastructure as code
  • We are experts in security, Linux and databases
  • We support your dev team to perform
Read more Show archive.org snapshot

What you can do to save time is to open a transaction and save multiple records within that transaction:

transaction do
  500.times { Model.create! }
end

Although you will still trigger 500 INSERT statements, they will complete considerably faster.

When I tried it out with a simple model and 500 iterations, the loop completed in 1.5 seconds vs. 6 seconds without a transaction.

Alternative

Another fast way to insert many records is to have a single INSERT statement describing multiple rows Show archive.org snapshot .

In Rails 6+ you can do so with ActiveRecord::Base.insert_all Show archive.org snapshot . This is very fast, but you won't get the usual guarantees from validations or transactions.

Posted by Henning Koch to makandra dev (2011-03-17 14:11)