【问题标题】:php postgres from query to fetching rows in theoryphp postgres 从查询到理论上获取行
【发布时间】:2012-07-06 02:45:42
【问题描述】:

我想知道到底发生了什么,因为 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 脚本所需的内存,但是如何影响资源使用的内存呢?李>

提前致谢。

【问题讨论】:

    标签: php postgresql optimization memory driver


    【解决方案1】:

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

    另一种方法是使用一次可以返回一行的游标。一些驱动直接支持这个(可能是PDO?)或者你可以使用DECLARE和FETCH

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-06-19
        • 1970-01-01
        • 2016-07-06
        • 2018-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多