Re: Unbuffered queries

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]



Correct. I ended up limiting the number of records I query at a time. I'm not sure how much of the thread has been e-mailed to you but I have an example that shows the method in which I was able to query N number of records every iteration.

Thank you for the response!

Eric Chamberlain

> Date: Thu, 9 Jan 2014 17:08:53 +1300
> From: mark.kirkwood@xxxxxxxxxxxxxxx
> To: andrew@xxxxxxxxxxxx; eric.chamberlain@xxxxxxxxxxx
> CC: pgsql-php@xxxxxxxxxxxxxx
> Subject: Re: Unbuffered queries
>
> On 09/01/14 13:31, Andrew McMillan wrote:
> > On Wed, 2014-01-08 at 13:53 -0600, Eric Chamberlain wrote:
> >> When using php_query(), is this buffering all of the results from the
> >> query into memory? If so, is there a parameter I can send to make it
> >> not buffer the query? I've also seen comments suggesting that a cursor
> >> should be used. There doesn't seem to be any way to get access to the
> >> internal cursor used by the PHP pgsql libs... or are they referring to
> >> doing something like this:
> >>
> >>
> >> $result = pg_query($conn, "BEGIN; DECLARE s CURSOR FOR SELECT * FROM
> >> users; FETCH ALL IN s; END;");
> >>
> >>
> >> And then after which I could do this:
> >>
> >>
> >> while ($row = pg_fetch_assoc($result)) {
> >> ...
> >> }
> >>
> >>
> >> I don't have a large enough result set in my development or QA
> >> environment to run this query within PHP to know if it works or not.
> >> Any suggestions would be helpful. Thank you!
> > You should *not* use the pg_* functions in PHP. Read up on PDO and use
> > that.
> >
> > http://php.net/pdo
> >
> > Using PDO you will get a 'PDOStatement' object to be the result of a
> > cusor-returning method (execute, query, prepare, ...), and then call
> > methods on that to 'fetch' or 'fetchObject' etc, etc.
> >
> > http://php.net/manual/en/class.pdostatement.php
> >
> > PDO is similar to Perl's DBI (and various other database independence
> > layers) and allows for statement construction with replaceable
> > parameters to avoid SQL insertion errors along with many, many more
> > features.
> >
> > pg_* should die in a fire. God has been killing a kitten every time is
> > has been used since 2003, which is unfortunately a lot of completely
> > avoidable kitten deaths :-(
> >
>
>
> I think a 2 step approach is needed - 1 statement to declare the cursor
> and execute it, another to explicitly call FETCH on it in a loop. I
> think attempting to do a FETCH ALL will just blow all your memory again.
>
> Here's a rough PDO example (I use FETCH 1 - FETCH n (n=100 say) is
> better, but for simplicity I'm doing just 1):
>
> $cursql = "DECLARE cur1 CURSOR FOR SELECT aid FROM pgbench_accounts
> WHERE bid = ?";
> $sql = "FETCH 1 FROM cur1";
>
> $dbh->beginTransaction();
> $curstmt = $dbh->prepare($cursql);
> $curstmt->execute(array(rand(0, 100)));
>
> for ($i = 0; ; $i++) {
> $stmt = $dbh->prepare($sql);
> $stmt->execute();
> $row = $stmt->fetch(PDO::FETCH_ASSOC);
> print "... " . $row['aid'] ."\n";
> }
>
>
>
> --
> Sent via pgsql-php mailing list (pgsql-php@xxxxxxxxxxxxxx)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-php

[Index of Archives]     [Postgresql General]     [Postgresql Admin]     [PHP Users]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Databases]     [Yosemite Backpacking]     [Postgresql Jobs]

  Powered by Linux