Thread: Re: pg_fetch_array

Re: pg_fetch_array

From
ljb
Date:
Thanks@verymuch.com wrote:
> Hello....
>
> I would like to know the performance of pg_fetch_array.  Cosider the code:
>
> $query = "select * from foo";
> $result = pg_query( $db, $query );
>
> while ($row = pg_fetch_array($result))
> {
>    $a = $row["a"];
>    $b = $row["b"];
>    $c = $row["c"];
>    $d = $row["d"];
> }
>
> Does php need to read database everytime when pg_fetch_array is executed in
> the while loop or all the rows have been in the memory after pg_query?

The whole result query is stored in memory when pg_query returns, and
pg_fetch_array just gets the next row.

> If read database is needed, is there any method to copy all the things into
> memory by using other command? (because I have a application which needs
> large amount database update/retrieval and I wish the performance of the
> overall applications run faster.)
>
> or other method you would like to recommend in order to make the faster
> response time?

Actually, bringing the whole result into memory before processing any rows
can be slower, since the web server has to wait for the database server to
finish before it can start working on the data. So you can't get any
overlap of database and web server processing.  As far as I know, there
isn't any alternative currently in the PHP PostgreSQL interface; there are
asynchronous queries but you still can't process any rows until they all
come back.

Re: pg_fetch_array

From
"Scott Marlowe"
Date:
On Mon, 2004-06-14 at 18:04, ljb wrote:
> Thanks@verymuch.com wrote:
> > Hello....
> >
> > I would like to know the performance of pg_fetch_array.  Cosider the code:
> >
> > $query = "select * from foo";
> > $result = pg_query( $db, $query );
> >
> > while ($row = pg_fetch_array($result))
> > {
> >    $a = $row["a"];
> >    $b = $row["b"];
> >    $c = $row["c"];
> >    $d = $row["d"];
> > }
> >
> > Does php need to read database everytime when pg_fetch_array is executed in
> > the while loop or all the rows have been in the memory after pg_query?
>
> The whole result query is stored in memory when pg_query returns, and
> pg_fetch_array just gets the next row.
>
> > If read database is needed, is there any method to copy all the things into
> > memory by using other command? (because I have a application which needs
> > large amount database update/retrieval and I wish the performance of the
> > overall applications run faster.)
> >
> > or other method you would like to recommend in order to make the faster
> > response time?
>
> Actually, bringing the whole result into memory before processing any rows
> can be slower, since the web server has to wait for the database server to
> finish before it can start working on the data. So you can't get any
> overlap of database and web server processing.  As far as I know, there
> isn't any alternative currently in the PHP PostgreSQL interface; there are
> asynchronous queries but you still can't process any rows until they all
> come back.

Yes, operating on the whole set in memory at one time is not the best
job for PHP, but maybe for PostgreSQL.

And there is a way to retrieve some small percentage at a time, use a
cursor.  See declare and fetch in the manual.  Works a charm in PHP.