----- Original Message -----
From: "Alex Pilosov" <[EMAIL PROTECTED]>
To: "Michael Wray" <[EMAIL PROTECTED]>
Cc: <[EMAIL PROTECTED]>
Sent: Wednesday, November 14, 2001 10:51 AM
Subject: Re: Perl Pg Vs. DBD::Pg
> Using DBI, you must be careful how you fetch the data.
>
> There are methods for fetching entire result set as an array of arrays or
> array of hashes, but doing row-by-row fetching as a reference of an array
> is fastest. That was most likely the reason for disparity.
And more....
If you use Apache, mod_perl and Apache::DBI make
your DBI script faster.
#because of less connections
If you use almost same statements except for values,
you may use "place holder" like below:
[Sample]
use strict;
use Benchmark;
use Pg;
use DBI;
my $iLoop = 5000;
my $sDt = '2001-12-18';
my $sSel = 'SELECT TITLE, CREDT FROM ALBUM ORDER BY TITLE';
my @aPg;
{
$aPg[0] = new Benchmark;
my $oConn = Pg::connectdb('host=lins dbname=test user=scott
password=tiger');
die $oConn->errorMessage if($oConn->status != PGRES_CONNECTION_OK);
$oConn->exec('begin');
$oConn->exec('DELETE FROM ALBUM');
$oConn->exec('end');
$aPg[1] = new Benchmark;
$oConn->exec('begin');
for(my $i=0;$i<$iLoop;$i++) {
$oConn->exec("INSERT INTO
ALBUM(TITLE,CREDT)VALUES('TTL-$i','$sDt')");
}
$oConn->exec('end');
$aPg[2] = new Benchmark;
my $result = $oConn->exec($sSel);
my $sLine;
while (my @row = $result->fetchrow) { $sLine = join(':', @row); }
$aPg[3] = new Benchmark;
}
my @aDb;
{
$aDb[0] = new Benchmark;
my $hDb = DBI->connect('dbi:Pg:host=lins;dbname=test',
'scott', 'tiger', {RaiseError => 1, AutoCommit=>0});
$hDb->commit;
$hDb->do('DELETE FROM ALBUM');
$aDb[1] = new Benchmark;
for(my $i=0;$i<$iLoop;$i++) {
$hDb->do("INSERT INTO ALBUM(TITLE,CREDT)VALUES('TTL-$i','$sDt')");
}
$hDb->commit;
$aDb[2] = new Benchmark;
my $hSt = $hDb->prepare( $sSel );
$hSt->execute();
my $sLine;
while(my $raData=$hSt->fetchrow_arrayref()){ $sLine = join(':',
@$raData);}
$hSt->finish;
$hDb->disconnect;
$aDb[3] = new Benchmark;
}
my @aDbP;
$aDbP[0] = new Benchmark;
{
my $hDb = DBI->connect('dbi:Pg:host=lins;dbname=test',
'scott', 'tiger', {RaiseError => 1, AutoCommit=>0});
$hDb->commit;
$hDb->do('DELETE FROM ALBUM');
$aDbP[1] = new Benchmark;
my $hStI = $hDb->prepare(q/INSERT INTO ALBUM(TITLE,CREDT)VALUES(?, ?)/);
for(my $i=0;$i<$iLoop;$i++) {$hStI->execute("TTL-$i", $sDt); }
$hDb->commit;
$aDbP[2] = new Benchmark;
my $hSt = $hDb->prepare($sSel);
$hSt->execute();
my $sLine;
while(my $raData=$hSt->fetchrow_arrayref()){$sLine = join(':',
@$raData); }
$hSt->finish;
$hDb->disconnect;
$aDbP[3] = new Benchmark;
}
print "Pg\n",
"1:",timestr(timediff($aPg[1], $aPg[0])),"\n",
"2:",timestr(timediff($aPg[2], $aPg[0])),"\n",
"3:",timestr(timediff($aPg[3], $aPg[0])),"\n",
"DBI-1\n",
"1:",timestr(timediff($aDb[1], $aDb[0])),"\n",
"2:",timestr(timediff($aDb[2], $aDb[0])),"\n",
"3:",timestr(timediff($aDb[3], $aDb[0])),"\n",
"DBI-2\n",
"1:",timestr(timediff($aDbP[1], $aDbP[0])),"\n",
"2:",timestr(timediff($aDbP[2], $aDbP[0])),"\n",
"3:",timestr(timediff($aDbP[3], $aDbP[0])),"\n";
[Result]
Pg
1: 0 wallclock secs ( 0.00 usr + 0.01 sys = 0.01 CPU)
2: 8 wallclock secs ( 1.60 usr + 0.79 sys = 2.39 CPU)
3: 9 wallclock secs ( 1.69 usr + 0.81 sys = 2.50 CPU)
DBI-1
1: 0 wallclock secs ( 0.07 usr + 0.01 sys = 0.08 CPU)
2:14 wallclock secs ( 4.93 usr + 0.97 sys = 5.90 CPU)
3:14 wallclock secs ( 5.02 usr + 1.00 sys = 6.02 CPU)
DBI-2
1: 0 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU)
2:10 wallclock secs ( 1.83 usr + 0.82 sys = 2.65 CPU)
3:10 wallclock secs ( 1.93 usr + 0.82 sys = 2.75 CPU)
==============================================
Kawai, Takanori(Hippo2000)
Mail: [EMAIL PROTECTED] [EMAIL PROTECTED]
http://member.nifty.ne.jp/hippo2000
==============================================