ActiveRecord выполняет вставки / удаления навалом, когда внутри транзакции? - PullRequest
12 голосов
/ 07 мая 2011

Что мне нужно:

  1. обеспечение атомарных обновлений (никакая запись не может быть обработана 2 раза)
  2. массовое удаление для всех 1000 выбранных строк

@queue = Queue.where("col = 1").limit(1000)
ids = []
@queue.each do |row|
    Queue.do_something(row)
    ids << row.id
end

Queue.delete_all("id in (#{ids.join(',')}) ")

ТАК ЖЕ КАК

Queue.transaction do
    @queue.each do |row|
        Queue.do_something(row)
        Queue.delete(row.id)
    end
end

Ответы [ 2 ]

16 голосов
/ 07 мая 2011

Для вставок:

ActiveRecord не выполняет массовую вставку при использовании транзакции. Однако это немного ускоряет процесс, поскольку он использует одну транзакцию для выполнения всех операторов INSERT, в отличие от одной транзакции на оператор INSERT в противном случае.

Итак:

Queue.transaction do 
  @queue.each do |row|
    # an INSERT is done here
  end
end

будет быстрее чем:

@queue.each do |row|
  # an INSERT is done here
end

Для получения дополнительной информации о том, как действительно выполнять массовые вставки, ознакомьтесь с статьей .

Для удалений:

Вызов ActiveRecord delete_all является одним оператором SQL DELETE, поэтому я думаю, вы могли бы рассматривать это как массовое удаление (нет необходимости использовать транзакцию здесь, поскольку она уже заключена в одну транзакцию ActiveRecord). Это не тот случай, когда вызывается delete для каждой записи, что приводит к нескольким операторам SQL DELETE, таким образом, инициируется и фиксируется несколько транзакций, что в целом снижает производительность.

3 голосов
/ 05 сентября 2012

Предлагаю вам взглянуть на импорт ActiveRecord: https://github.com/zdennis/activerecord-import.

Я использую этот инструмент для вставки от 10000 до 100000 строк данных.

books = []
10.times do |i| 
  books << Book.new(:name => "book #{i}")
end
Book.import books

Если вы используете MySQL, он также поддерживает ON DUPLICATE KEY UPDATE, чтобы вы могли разумно вставлять новые / обновлять старые строки. https://github.com/zdennis/activerecord-import/wiki/MySQL:-On-Duplicate-Key-Update-Support

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...