Я забыл об использовании :batch_size
, но Чандра предложил это. Это правильный путь.
Использование .all
попросит базу данных извлечь все записи, передав их в Ruby для хранения, а затем перебрать их внутри. Это действительно плохой способ справиться с этим, если ваша база данных будет расти. Это связано с тем, что глобус записей будет усложнять работу DBM по мере роста, и Ruby придется выделять все больше и больше места для их хранения. В результате ваше время отклика будет расти.
Лучшее решение состоит в том, чтобы использовать опции :limit
и :offset
, чтобы указать DBM последовательно находить первые 1000 записей со смещением 0, затем следующие 1000 записей со смещением 1 и т. Д. больше записей.
Вы можете определить, сколько раз вам придется зацикливаться, выполнив .count
перед тем, как начать спрашивать, что действительно быстро, если ваше предложение where не является чудовищным, или просто зацикливаться, пока не получите никаких записей назад.