----- 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
==============================================

Reply via email to