FYI: Access methods - relative speed
"H.Merijn Brand" <[email protected]>
| Newsgroups | gmane.comp.lang.perl.modules.dbi.sybase.devel |
|---|---|
| Message-ID | <[email protected]> |
I thought it might be time to re-check my performance graph(s) on
access methods in DBI now that most DBD's and engines have moved
forward since I did the previous tests:
http://tux.nl/Talks/DBDc/prfx.html
$ cat test.pl
#!/pro/bin/perl
use 5.16.1;
use warnings;
use Time::HiRes qw( gettimeofday tv_interval );
use DBI;
my $n = 100000;
# This test is about RELATIVE speed differences for access methods
# Not about speed differences between databases
my %db = (
Pg => {
dns => "dbname=$ENV{LOGNAME}",
n => $n,
},
mysql => {
dsn => "database=$ENV{LOGNAME}",
n => $n / 100,
},
Oracle => {
dsn => "host=$ENV{ORACLE_HOST};sid=$ENV{ORACLE_SID}",
user => $ENV{ORACLE_USER},
pass => $ENV{ORACLE_PASS},
n => $n / 50,
},
SQLite => {
dsn => "dbname=sqlite.db",
n => $n,
},
# Unify => {
# },
CSV => {
n => $n / 100,
},
);
my %am = (
HR => sub { my $sth = shift;
while (my $ref = $sth->fetchrow_hashref) { }
},
A => sub { my $sth = shift;
while (my ($k, $c, $i, $v) = $sth->fetchrow_array) { }
},
AR => sub { my $sth = shift;
while (my $ref = $sth->fetchrow_arrayref) { }
},
DAR => sub { my $sth = shift;
while (my $ref = DBI::st::fetchrow_arrayref ($sth)) { }
},
BC => sub { my $sth = shift;
$sth->bind_columns (\my ($k, $c, $i, $v));
while ($sth->fetch) { }
},
DBC => sub { my $sth = shift;
$sth->bind_columns (\my ($k, $c, $i, $v));
while (DBI::st::fetchrow_arrayref ($sth)) { }
},
);
my %x;
foreach my $db (keys %db) {
print STDERR " $db ? \r";
my $v;
eval "require DBD::$db; \$v = DBD::$db->VERSION ()";
$@ and next;
$db{$db}{vsn} = $v;
warn "Testing for DBD::$db-$v\n";
my $dsn = "dbi:$db:";
$db{$db}{dsn} and $dsn .= $db{$db}{dsn};
$db{$db}{$_} //= undef for qw( user pass );
$ENV{$_} = $db{$db}{env}{$_} for keys %{$db{$db}{env} // {}};
my $dbh = DBI->connect ($dsn, $db{$db}{user}, $db{$db}{pass}, {
RaiseError => 1,
PrintError => 1,
ChopBlanks => 1,
ShowErrorStatement => 1,
FetchHashKeyName => "NAME_lc",
}) or next;
$db eq "CSV" || $db eq "mysql" or $dbh->{AutoCommit} = 0;
$dbh->do (qq;
create table test10 (
k integer not null primary key,
c char (10),
i integer,
v varchar (10)
););
$dbh->{AutoCommit} or $dbh->commit;
my $sti = $dbh->prepare ("insert into test10 values (?, ?, ?, ?)");
$sti->execute ($_, $_, $_, $_) for 1 .. $db{$db}{n};
$sti->finish;
$dbh->{AutoCommit} or $dbh->commit;
foreach my $am (keys %am) {
my $sth = $dbh->prepare ("select k, c, i, v from test10");
$sth->execute;
my $t0 = [gettimeofday];
$am{$am}->($sth);
$x{$db}{$am} = tv_interval ($t0);
}
$dbh->do ("drop table test10");
$dbh->{AutoCommit} or $dbh->commit;
$dbh->disconnect;
}
warn "Done!\n";
foreach my $db (keys %x) {
my $norm = 1000 * $x{$db}{A};
my %c = map { $_ => int ($norm / $x{$db}{$_}) } keys %am;
print "$db-$db{$db}{vsn}\n";
printf "%6s %5d\n", $_, $c{$_} for sort { $c{$a} <=> $c{$b} } keys %c;
}
$ perl speed.pl
Oracle-1.68
HR 639
DBC 804
AR 913
BC 956
DAR 967
A 999
SQLite-1.40
HR 255
A 1000
AR 1041
DAR 1166
BC 1333
DBC 1455
Pg-3.0.0
HR 198
A 1000
AR 1143
DAR 1186
DBC 1326
BC 1332
CSV-0.41
HR 683
A 1000
AR 1164
DAR 1171
BC 1181
DBC 1185
mysql-4.025
HR 102
A 999
AR 1126
DAR 1271
BC 1287
DBC 1328
This clearly shows that having Oracle on a remote host causes the
network to have more influence than the access method
--
H.Merijn Brand http://tux.nl Perl Monger http://amsterdam.pm.org/
using perl5.00307 .. 5.19 porting perl5 on HP-UX, AIX, and openSUSE
http://mirrors.develooper.com/hpux/ http://www.test-smoke.org/
http://qa.perl.org http://www.goldmark.org/jeff/stupid-disclaimers/