Как сделать PDO (pdo_pgsql) для ленивой выборки строк

С помощью следующего кода, хотя я получаю одну строку – весь набор данных загружается (что занимает несколько секунд):

$query = 'SELECT * FROM xxx WHERE id > :position ORDER BY id'; $stmt = $db->prepare($query); $stmt->execute([ ':position' => $position, ]); while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) { break; } 

Я попытался найти вариант в PDO, который заставил бы его извлекать строки по требованию (или разумными партиями), но не смог это сделать, по крайней мере, я не смог найти его в документации PDO.

Postgresql для данного запроса способен обслуживать первую строку в 0.28ms в соответствии с EXPLAIN ANALYZE .

И моя цель – как можно быстрее начать обработку строк, даже если последующие партии строк появятся с некоторыми сетевыми издержками.

Как я определил, что он извлекает все строки:

  1. Косвенно: требуется одно и то же время для break после первой строки или для итерации по всему набору данных
  2. Я захватил трафик с помощью tcpdump и проверил, что он извлекает все строки.

Таким образом, возникает вопрос: возможно ли сделать PDO для выборки в строке за строкой (или в некоторых разумных небольших партиях) по требованию?

Я нашел ответ:

 $stmt = $db->prepare($query, [\PDO::ATTR_CURSOR => \PDO::CURSOR_SCROLL]); 

Поэтому оператор должен быть создан с опцией \PDO::CURSOR_SCROLL

Рекомендации: