php postgres从查询到理论上的获取行

时间:2012-07-05 16:33:00

标签: php postgresql optimization memory driver

我想知道自从php脚本运行查询到数据库返回数据并且php脚本开始获取它们的时候究竟发生了什么。

理论上,我有一个带有大表的Postgre数据库,谈论有20多列的10/20百万条记录,我有一个php脚本,它要求将数据库中的所有行放入,比方说,一些文件

我的知识是:

  • php脚本使用sql查询运行pg_query命令
  • 通过postgres php驱动/扩展查询传递给数据库
  • 数据库完成工作并将结果返回给驱动程序
  • php postgres驱动程序将结果存储在服务器RAM内存中并将资源ID返回给php脚本,该脚本是对结果的引用
  • pg_fetch_row从RAM内存中读取记录

我正在努力实现最好的PHP代码优化,这正在做上面描述的工作。

问题是:

  • 我的知识是否正确?如果缺少某些内容或我对某些步骤不对,请纠正我。
  • 我怎么知道为数据库结果分配了多少RAM内存?如果我的服务器没有足够的内存,这可能很重要。
  • 我知道我可以获取单行,然后将其存储到文件中,并且只要有行就重复这两个步骤,这样我可以最小化php脚本所需的内存,但是如何影响资源使用的内存?

提前致谢。

2 个答案:

答案 0 :(得分:1)

查询执行后PHP脚本分配的内存量与之前的差异将为您提供由DB结果分配的内存量。

$before = memory_get_usage();
$res = pg_query( $sql );
$after  = memory_get_usage();
$amount = $after - $before //This should be size of $res variable;

答案 1 :(得分:1)

PostgreSQL(默认情况下)一次性返回所有行。这样做的好处是可以在服务器端释放资源,代价是客户端可能有大量的结果集。

另一种方法是使用一次可以返回单行的游标。有些驱动程序直接支持此功能(可能是PDO?),或者您可以使用DECLAREFETCH

另一件需要注意的是PostgreSQL的COPY命令,它可以直接将表或查询转储到文件中(假设您不需要太多处理/格式化)。检查数据库库是否提供直接访问。