查询返回速度很好,但是获取很慢
Posted
技术标签:
【中文标题】查询返回速度很好,但是获取很慢【英文标题】:Query return speed is fine but fetch is very slow 【发布时间】:2021-12-14 20:52:28 【问题描述】:PostgreSQL 14
php 7.4
我有一个 PHP 调用,它返回一个可滚动游标 (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;
更新回答问题:
客户端和服务器之间的网络距离?
零。两者都在本地主机上。
在数据库层或应用程序前端测量的返回时间在哪里?
从执行查询到返回句柄的时间。拿到手柄就好了。它是 fetch 循环本身,一旦开始就会永远持续下去。 PHP 正在测量 fetch 循环的执行时间。
是需要一个一个去取还是可以分批去取?
我可以批量获取并逐个处理批次,但基本查询非常繁重,重复运行它以获得偏移量并不好。
【问题讨论】:
客户端和服务器之间的网络距离?在数据库层或应用程序前端测量的返回时间在哪里?是需要一个一个取还是可以分批取?添加答案以更新您的问题。 如果您使用的是 Postgres 游标,那么 FETCH 允许您执行“FORWARD count 获取下一个计数行。FORWARD 0 重新获取当前行。” 这样更快吗?我用一个简单的只进游标测试了这个 - 没有特殊选项 - 并且遇到了同样的速度问题。 在 psql 中使用 EXPLAIN (ANALYZE, BUFFERS) 运行保存查询需要多长时间? 伙计们,它是一个服务器端游标,一次获取一条记录。算一下:12 分钟 x 60 = 720 秒。 720 秒/760,000 条记录 = 0.00095 秒/记录。问题不在服务器端,而是在客户端完成的迭代次数。 【参考方案1】:尝试在psql
命令行上运行您的语句。
如果那里也很慢,您必须使用EXPLAIN (ANALYZE, BUFFERS)
了解原因(并将执行计划添加到问题中以获得进一步帮助)。
如果在 psql
中速度很快,则问题要么是 760000 次客户端-服务器往返,要么是您没有将 cursor_tuple_fraction
设置为 1.0。
【讨论】:
cursor_tuple_fraction 设置和批处理的结合提供了显着的改进。谢谢大家!以上是关于查询返回速度很好,但是获取很慢的主要内容,如果未能解决你的问题,请参考以下文章
“对象控制器”,实体模式:在 Mavericks 上获取速度很慢
mybatis分页查询,SqlServer 2008 查询速度很慢
使用 NOT IN ( SELECT ... ) 时查询执行速度很慢