Більшість реалізацій DBAPI повністю буферизують рядки у міру їх отримання - тому, як правило, перш ніж SQLAlchemy ORM навіть отримує один результат, весь набір результатів знаходиться в пам'яті.
Але тоді, як Query
працює, це те, що він повністю завантажує заданий результат за замовчуванням, перш ніж повертати вам ваші об’єкти. Обґрунтування тут стосується запитів, які є більше, ніж простими операторами SELECT. Наприклад, при об'єднаннях до інших таблиць, які можуть повертати одну і ту ж ідентичність об'єкта кілька разів в одному наборі результатів (загальне для нетерплячого завантаження), повний набір рядків повинен бути в пам'яті, щоб правильні результати могли бути повернуті в іншому випадку колекції і такі може бути заселено лише частково.
Тож Query
пропонує можливість змінити цю поведінку за допомогою yield_per()
. Цей виклик призведе Query
до отримання рядків рядками, де ви надаєте йому розмір партії. Як зазначається у документах, це доречно лише у тому випадку, якщо ви не робите будь-якого нетерплячого завантаження колекцій, тому в основному, якщо ви дійсно знаєте, що робите. Крім того, якщо базовий DBAPI попередньо буферизує рядки, ця пам'ять все одно залишатиметься, тому підхід лише масштабується трохи краще, ніж не використовувати його.
Я майже ніколи не використовую yield_per()
; натомість я використовую кращу версію підходу LIMIT, який ви запропонували вище, використовуючи функції вікна. LIMIT та OFFSET мають величезну проблему, оскільки дуже великі значення OFFSET спричиняють повільніший та повільніший запит, оскільки OFFSET з N змушує його переходити через N рядків - це все одно, що робити один і той же запит п'ятдесят разів замість одного, кожного разу читаючи більша і більша кількість рядів. За допомогою підходу з функцією вікна я попередньо отримую набір значень "вікно", які посилаються на фрагменти таблиці, яку я хочу вибрати. Потім я видаю окремі оператори SELECT, які кожен витягує з одного з цих вікон одночасно.
Підхід до функцій вікна знаходиться у вікі, і я користуюся ним із великим успіхом.
Також зверніть увагу: не всі бази даних підтримують функції вікна; вам потрібен Postgresql, Oracle або SQL Server. IMHO із використанням принаймні Postgresql однозначно варто - якщо ви використовуєте реляційну базу даних, ви можете скористатися найкращим.