如何使PDO(pdo_pgsql)懒惰地获取行

zer*_*kms 5 php postgresql pdo

使用以下代码,即使我获取单行 - 下载整个数据集(需要几秒钟):

$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;
}
Run Code Online (Sandbox Code Playgroud)

我试图在PDO中找到一个选项,使其按需获取行(或通过合理的批次),但未能这样做,至少我在PDO文档中找不到它.

PostgreSQL的针对特定查询能够服务第一行中0.28ms按了EXPLAIN ANALYZE.

我的目标是尽可能快地开始处理行,即使进一步批量的行会带来一些网络开销.

我如何确定它获取所有行:

  1. 间接地:break在第一行之后需要相同的时间或迭代整个数据集
  2. 我捕获了流量tcpdump并检查它是否获取了所有行.

所以,问题是:是否有可能PDO在需求模式下逐行(或一些合理的小批量)获取?

zer*_*kms 3

我找到了答案:

$stmt = $db->prepare($query, [\PDO::ATTR_CURSOR => \PDO::CURSOR_SCROLL]);
Run Code Online (Sandbox Code Playgroud)

\PDO::CURSOR_SCROLL因此必须使用选项创建该语句

参考: