php - para - Cómo hacer que PDO(pdo_pgsql) busque filas de forma perezosa
fetchall(pdo::fetch_obj) (1)
Con el siguiente código, aunque busco una sola fila, se descarga todo el conjunto de datos (lo que demora unos segundos):
$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;
}
Traté de encontrar una opción en PDO que permitiera obtener filas según demanda (o por lotes razonables), pero no lo hice, al menos no pude encontrarla en la documentación de PDO.
Postgresql para la consulta dada puede servir a la primera fila en 0.28ms
según el EXPLAIN ANALYZE
.
Y mi objetivo es comenzar a procesar las filas lo más rápido posible, incluso si vienen más lotes de filas con una sobrecarga de red.
Cómo determiné que obtiene todas las filas:
- Indirectamente: toma el mismo tiempo para
break
después de la primera fila o para iterar sobre el conjunto de datos completo - Capturé el tráfico con
tcpdump
y verifiqué que recupera todas las filas.
Entonces, la pregunta es: ¿es posible hacer que PDO
busque en un modo fila por fila (o algunos lotes pequeños razonables) en demanda?
Encontré la respuesta:
$stmt = $db->prepare($query, [/PDO::ATTR_CURSOR => /PDO::CURSOR_SCROLL]);
Por lo tanto, la sentencia debe crearse con una opción /PDO::CURSOR_SCROLL
Referencias