Re: DBI & DBD::Pg processor load - Mailing list pgsql-general

From Tommi Maekitalo
Subject Re: DBI & DBD::Pg processor load
Date
Msg-id 200304241447.56173.t.maekitalo@epgmbh.de
Whole thread Raw
In response to Re: DBI & DBD::Pg processor load  (Chris Gamache <cgg007@yahoo.com>)
List pgsql-general
Hi,

I don't know the internals of DBD::Pg, but I know some internals about the
underlying c-interface.

It looks like executing the select feches all 100,000 records at once. You
should use a cursor for that.

$dbh->do('BEGIN WORK'); # you need to start a transaction for a cursor
$dbh->do("DECLARE cursor1 CURSOR $mysql_get");
my $sth_fetch = $dbh->prepare('FETCH 100 FROM cursor1');
while(my $res = $dbh->selectall_arrayref($sth_fetch))
{
  foreach (@$res)
  {
    my @row = @$_;
    ...do something with your data
  }
}
$dbh->do('COMMIT');  # or ROLLBACK

By the way: You don't need to lock your table to update. Update does it for
you. And there is no need to start a transaction for a single
update-statement. And passing perl-variables as bind-values is better,
because DBI/DBD escapes your values automatically.

$dbh->do('UPDATE queue
       set status=?
     WHERE id = (SELECT min(id)
        FROM queue
        WHERE status=0', {}, $procid);


Tommi

Am Montag, 21. April 2003 17:12 schrieb Chris Gamache:
> Its interesting: the perl process doesn't soak up a huge amount of
> processor time, but the postmaster connection created by DBI does. My queue
> table is indexed, and my queue table is large (100,000 records). It is
> fully vacuumed and analyized every night... I haven't turned on debugging
> yet, but that's my next thing to try. I also might try archiving the table
> at 10000 rows, but PgSQL::Cursor didn't have a problem with the 100,000 row
> queue...
>
> [----BEGIN TEST CODE----]
>
> #!/usr/local/bin/perl
>
> #
> # Set process id...
> #
>
> my $procid = $$;
>
> use DBI;
>
> my $rs;
> my $dbh = DBI->connect("dbi:Pg:dbname=mydb","myuser","mypass");
>
> my $finished = false;
>
> while ($finished ne true) {
>
>   #
>   # Begin Transaction...
>   #
>
>   #
>   # Claim a record for ourselves
>   #
>   my $mysql_update = <<EOS;
>     BEGIN;
>     LOCK TABLE queue IN EXCLUSIVE MODE;
>     UPDATE queue
>       set status=$procid
>     WHERE id = (SELECT min(id)
>        FROM queue
>        WHERE status=0
>     );
>     COMMIT;
> EOS
>   my $rs_update = $dbh->prepare($mysql_update);
>   $rs_update->execute;
>
>   #
>   # Get the row from the batch_trans_queue
>   #
>   my $mysql_get = <<EOS;
>     SELECT id, my_type, my_data
>     FROM queue
>     WHERE status=$procid;
> EOS
>   my $rs_get = $dbh->prepare($mysql_get);
>   $rs_get->execute;
>
>   #
>   # We got a record...
>   #
>
>   while ($row_get = $rs_get->fetchrow_arrayref) {
>     #
>     # Get queue values
>     #
>     my @row = @$row_get if $row_get;
>     my $id = @row[0];
>     my $my_type = @row[1];
>     my $my_data = @row[2];
>
>     print "VALUES: $my_type $my_data\n";
>
>     #
>     # Set record completed
>     #
>     $mysql_update = "update queue set status=1 where id=$id;";
>     $rs_update = $dbh->prepare($mysql_update);
>     $rs_update->execute;
>   }
>   $rs_get->finish;
>   sleep(1);
> }
>
> #
> # disconnect from server
> #
> $dbh->disconnect;
>
> [----END TEST CODE----]
>
> CG
>
> --- greg@turnstep.com wrote:
> > -----BEGIN PGP SIGNED MESSAGE-----
> > Hash: SHA1
> >
> > > Are there any DBI experts out there with some advice to cut down
> > > on processor usage?
> >
> > Very hard to say without knowing exactly what is going on. Can you
> > break it down into a simple case that you can post here? You might
> > also want to bump up the trace level "$dbh->trace(2)" and see if
> > that helps give an insight as to what is going on.
> >
> >>Linux 2.4.20 & PostgreSQL 7.2.3 & DBD::Pg 1.22.
> >>
> >>I was using PgSQL and PgSQL::Cursor with decent results. It is no
> >>longer supported, and was causing some strange problems. So, I switched
> >> to DBI
> >>with no problems to speak of. However, I immediately noticed a jump in
> >>processor usage. I primarily use
> >>$db->prepare($sql), $rs->execute, and $rs->fetchrow_arrayref.
> >>
> >>Are there any DBI experts out there with some advice to cut down on
> >>processor
> >>usage?
> >>
> >>CG
>
> __________________________________________________
> Do you Yahoo!?
> The New Yahoo! Search - Faster. Easier. Bingo
> http://search.yahoo.com
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo@postgresql.org so that your
> message can get through to the mailing list cleanly

--
Dr. Eckhardt + Partner GmbH
http://www.epgmbh.de


pgsql-general by date:

Previous
From: Tom Lane
Date:
Subject: Re: Unusual behaviour with intarray
Next
From: Thomas Kellerer
Date:
Subject: Maximum number of connections