Query return 速度还好,但是 fetch 很慢

Query return speed is fine but fetch is very slow

PostgreSQL 14

PHP 7.4

我有一个 PHP 调用,它 returns 一个可滚动游标 (PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL) 的句柄,其中包含大约 760,000 条记录。句柄将在合理的时间内返回。但是,一旦我拿回句柄,除了在循环中获取每条记录外,什么都不做会花费 12 分钟以上。我已经尝试将其作为具有类似结果的只进游标。我使用的是高性能处理器并且有足够的内存。每条记录有 181 个数字字段。我怎样才能提高它的性能?

$first = true;
while($rec = $handle->fetch(PDO::FETCH_ASSOC, $first ? PDO::FETCH_ORI_FIRST : PDO::FETCH_ORI_NEXT))
{
    $first = false;
}

更新回答问题:

Network distance between client and server?

零。两者都在本地主机上。

Where is the return time being measured in the database layer or an application frontend?

从执行查询到返回句柄的时间计算。拿到手柄就好了。获取循环本身一旦开始就会永远持续下去。 PHP 正在测量获取循环执行时间。

Do you need to fetch one by one or can you fetch in batches?

我可以分批获取并逐批处理,但基本查询非常繁重,运行重复获取偏移量并不好。

psql 命令行上尝试 运行 你的语句。

如果那里也很慢,您必须使用 EXPLAIN (ANALYZE, BUFFERS) 来理解原因(并将执行计划添加到问题中以获得进一步帮助)。

如果在 psql 中速度很快,问题要么是 760000 次客户端-服务器往返,要么是您没有将 cursor_tuple_fraction 设置为 1.0。