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

标签 php postgresql pdo

我正在使用带有 PDO 的 PHP 5.3.6 来访问 Postgres 9.0.4。我被要求减少报告的内存占用。当前的实现很简单:执行查询,执行 fetchAll(),然后使用 foreach() 遍历结果数组。这显然不适用于巨大的结果集:它会暂时消耗 100MB 或更多。

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

  • 我看过建议使用游标解决我原来的问题的文章。 Postgress PDO 驱动程序是否已在内部使用游标?如果需要编写自己的 SQL 来创建游标,我愿意,但我更愿意编写尽可能简单的代码(但不要更简单!)。

  • 如果 foreach 每次迭代都调用 fetch(),那网络不是太吵了吗?或者它是否聪明并一次获取多行,例如500,节省带宽? (这可能暗示它在内部使用游标。)

  • 我看到一篇文章将语句句柄包装在一个实现 Iterator 接口(interface)的类中。鉴于 PDO 语句句柄已经这样做了,这不是多余的吗?还是我遗漏了什么?

  • 我准备 SQL 语句的调用如下所示:

    $sth = $dbh->准备($sql);

我发现如果我这样做,它不会产生内存或速度差异:

$sth = $dbh->prepare($sql, array( PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY ) );

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

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

最佳答案

Postgres 的 PDO does use cursors internally .

关于php - 在 Postgres/PHP/PDO 中迭代结果集的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7878138/

相关文章:

node.js - 如何在 Node js 中更新 postgresql 中的 json 数据?

php - MySQL NOW() 与 PHP 时区不匹配

php - SQLSTATE[HY000] [1045] 尽管相同的用户名密码组合适用于 mysql_connect,但用户访问被拒绝

postgresql - Sequelize - 无法在 1 :N relationship 中保存关联

ruby-on-rails - 如何使用大写列名的 Rails?

php - php PDO 可以获取两个结果集吗?如果是,那么 1 个结果集或多于 1 个结果集哪个更好?

php - 您可以取消注册关机功能吗?

php - 设计表单处理以支持支持 AJAX 的浏览器和非 AJAX 浏览器的最简洁的方法是什么?

php上传多个文件

在类变量中使用 DIRECTORY_SEPARATOR 的 PHP 解析错误