Brainfuck писал(а): ↑2018.07.27, 11:00
Как черт возьми можно получать данные порционно, не используя при этом limit/offset?
объясняю на пальцах:
клиент шлет на сервер БД текст запроса.
при этом клиент говорит - ты мне сразу все не отдавай, может мне все и не понадобится.
сервер БД его транслирует и начинает выполнение, выгребая из файлов БД данные
но помня просьбу, выгребает не все, а останавливает выгребание, и отадет порцию
клиент получив порцию что-то с ней делает. и если мало, шлет серверу
дай еще!
сервер БД с места на котором остановился продолжает выгребать из файлов данные.
и опять шлет порцию.
это - в теории.
в конкретике нюансы зависят от реализации драйвера к БД и реализации сервера БД.
сервер БД может не понимать такой опции: "ты мне сразу все не отдавай, может мне все и не понадобится"
драйвер БД может запрашивать все, но когда получил часть - уже отдавать их потребителю, при этом в фоне получая остальные данные.
и так и дальше, драйвер БД может отдавать порционно, хотя он получил уже весь ответ.
Brainfuck писал(а): ↑2018.07.27, 11:00
Для меня это даже звучит абсурдно...
для меня нет, потому что понимаю как работают сервера и драйвера в данном случае
Brainfuck писал(а): ↑2018.07.27, 11:00
Так что выгоднее (по скорости и памяти) использовать each или batch? Или примерно одинаково?
зависит от того как вы работаете с данными. плюс еще и от того что написал выше.
например для гридов в админке - мы точно знаем что
нам нужна только порция данных
и такого-то размера
и для таког-то номера страницы.
значит limit offset и all() - самый правильный выбор
"фокусы" с порциями между драйвером и сервером БД нам ничего не дадут, и никак не помогут.
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.