Активная запись in_batches против find_in_batches - PullRequest
0 голосов
/ 21 октября 2019

Я хочу выполнить пакетные операции с миллионами записей из БД.

Согласно документации ActiveRecord, есть два метода для выполнения пакетных операций, а именно #find_in_batches & #in_batches. Но я не вижу никакой разницы между ними, за исключением того, что один возвращает Enumerator, а другой - ActiveRecord Relation.

Итак, учитывая их разную производительность, я хочу знать, какая из них работает лучшев каком сценарии. И есть ли лучший способ условно обновить миллионы строк, кроме необработанного SQL?

1 Ответ

1 голос
/ 21 октября 2019

Вы должны посмотреть на источник, чтобы понять разницу в производительности -

def find_in_batches(start: nil, finish: nil, batch_size: 1000, error_on_ignore: nil)
  relation = self
  unless block_given?
    return to_enum(:find_in_batches, start: start, finish: finish, batch_size: batch_size, error_on_ignore: error_on_ignore) do
      total = apply_limits(relation, start, finish).size
      (total - 1).div(batch_size) + 1
    end
  end

  in_batches(of: batch_size, start: start, finish: finish, load: true, error_on_ignore: error_on_ignore) do |batch|
    yield batch.to_a
  end
end

Обратите внимание на то, как вызывается метод in_batches и результат сохраняется в массиве. Это займет больше памяти. in_batches, следовательно, более эффективный способ здесь.

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