首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Postgres/PHP/PDO中迭代结果集的最佳实践?

在Postgres/PHP/PDO中迭代结果集的最佳实践?
EN

Stack Overflow用户
提问于 2011-10-24 15:36:11
回答 2查看 2.5K关注 0票数 1

我使用PHP5.3.6和PDO访问Postgres 9.0.4。我被要求减少报告的内存占用。当前的实现很简单:执行查询,执行一个fetchAll(),然后使用foreach()遍历得到的数组。这显然不会对结果集产生很大的影响:它可以临时消耗100 or或更多。

我有一个新的实现,它接受PDO语句句柄,然后使用foreach()直接在其上迭代,即没有通过fetchAll()的中间数组。(根据我所读到的,在封面下使用foreach调用来迭代语句句柄。)这同样快速,消耗了way更少的内存:大约28 as。尽管如此,我仍然不确定我做得对,因为尽管我已经做了大量的谷歌搜索,但很难找到关于这方面的基本问题的答案:

  • 我见过一些文章建议使用游标来解决我最初的问题。PDO驱动程序内部是否已经使用游标?如果需要编写自己的SQL来创建游标,我愿意这样做,但我更愿意编写尽可能简单的代码(但不是更简单)。
  • 如果foreach每次迭代都调用fetch(),这难道不是太过网络聊天吗?还是它是聪明的,一次取多行,例如500行,以节省带宽?(这可能意味着它在内部使用游标。)
  • 我看过一篇文章,它将语句句柄封装在实现Iterator接口的类中。考虑到PDO语句已经处理了,这不是多余的吗?还是我漏掉了什么?
  • 我准备SQL语句的调用如下所示: $sth = $dbh->prepare($sql);

我发现,如果我这样做,就没有记忆和速度上的差别:

代码语言:javascript
复制
$sth = $dbh->prepare($sql, array( PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY ) );

这是因为对于Postgres驱动程序来说,这是默认的吗?如果它已经在内部使用游标,这将是有意义的。

欢迎对解决这一问题的方法和其他方法提出一般性意见。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-24 15:46:28

PDO为Postgres 在内部使用游标吗

票数 1
EN

Stack Overflow用户

发布于 2014-05-20 16:39:42

显然,PDO::CURSOR_FWDONLY不使用游标。黑匣子测试:

(0)筹备工作:

代码语言:javascript
复制
$con = new \PDO('dsn');
// you'll get "NO ACTIVE TRANSACTION" otherwise
$con->beginTransaction();

$sql = 'select * from largetable';

(1)违约-需要永远:

代码语言:javascript
复制
$stmt = $con->prepare($sql);
$stmt->execute();
print_r($stmt->fetch());

(2) FWDONLY -永远:

代码语言:javascript
复制
$stmt = $con->prepare($sql, array(\PDO::ATTR_CURSOR => \PDO::CURSOR_FWDONLY));
$stmt->execute();
print_r($stmt->fetch());

(3)可滚动的--瞬间运行:

代码语言:javascript
复制
$stmt = $con->prepare($sql, array(\PDO::ATTR_CURSOR => \PDO::CURSOR_SCROLL));
$stmt->execute();
print_r($stmt->fetch());

我打开PG日志只是为了确定,这确实是唯一的卷轴使用游标。

因此,使用游标的唯一方法是使用滚动,至少在PHP 5.4.23中是这样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7878138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档