理论上,PHP 从查询到获取行


php postgres from query to fetching rows in theory

我想知道到底发生了什么,因为 php 脚本运行查询到数据库返回数据并且 php 脚本开始获取它们的那一刻。

从理论上讲,我有一个带有巨大表格的 Postgre 数据库,谈论 10/20 百万条记录,其中包含 20+ 列,我有一个 php 脚本,它请求将数据库中的所有行放入,比如说,某个文件。

我的知识是:

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

我正在尝试对正在执行上述工作的 php 代码进行最佳优化。

问题是:

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

提前谢谢。

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

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

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

PHP 脚本在查询执行之后和之前分配的内存量之间的差异,将提供数据库结果分配的内存量。

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