ActiveRecord: Creating many records works faster in a transaction

Updated . Posted . Visible to the public. Repeats.

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

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.

Henning Koch
Last edit
Michael Leimstädtner
Keywords
activerecord
License
Source code in this card is licensed under the MIT License.
Posted by Henning Koch to makandra dev (2011-03-17 13:11)