#! perl -slw use strict; use Time::HiRes qw[ time ]; use DBI; use constant { CREATE => 'create table DB ( NAME test primary key not null, ADDR int not null )', INSERT => 'insert into DB ( NAME, ADDR ) values ( ?, ? )', INDEX => 'create index ADDR_IDX on DB ( ADDR );', QUERYBYNAME => 'select ADDR from DB where NAME = ?', QUERYBYADDR => 'select NAME from DB where ADDR = ?', }; sub mem{ `tasklist /nh /fi "PID eq $$"` =~ m[(\S+ K)$] } our $S //= 1; my $scale = chr( ord('a') + $S - 1 ); print "Start: mem: ", mem; my $dbh = DBI->connect( 'dbi:SQLite:dbname=:memory:','','' ) or die DBI::errstr; $dbh->do( CREATE ) or die DBI::errstr; print "DB created: mem: ", mem; my $ins = $dbh->prepare( INSERT ) or die DBI->errstr; my $i = 1; for( 'aaaaa' .. $scale . 'zzzz' ) { $ins->execute( $_, $i++ ); } print "DB populated: mem: ", mem; $dbh->do( INDEX ); print "DB indexed: mem: ", mem;; my $start = time; my $sth = $dbh->prepare( QUERYBYNAME ) or die DBI->errstr; for( 'aaaaa' .. $scale . 'zzzz' ) { $sth->execute( $_ ) or die DBI::errstr; my $ref = $sth->fetch; my $addr = $ref->[0]; # print $addr; } printf "Fetch by Name took %f seconds \n", time() - $start; $start = time; $sth = $dbh->prepare( QUERYBYADDR ) or die DBI->errstr; for( 1 .. 26**4 * $S ) { $sth->execute( $_ ) or die DBI::errstr; my $ref = $sth->fetch; my $name = $ref->[0]; # print $name; } printf "Fetch by Addr took %f seconds \n", time() - $start; print "DB queried: mem: ", mem; __END__ C:\test>for /l %s in (1,1,4) do 1112165-sql -S=%s C:\test>1112165-sql -S=1 Start: mem: 9,656 K DB created: mem: 11,072 K DB populated: mem: 30,796 K DB indexed: mem: 39,384 K Fetch by Name took 6.933570 seconds Fetch by Addr took 7.299877 seconds DB queried: mem: 39,412 K C:\test>1112165-sql -S=2 Start: mem: 9,700 K DB created: mem: 11,116 K DB populated: mem: 50,088 K DB indexed: mem: 65,400 K Fetch by Name took 14.425735 seconds Fetch by Addr took 14.653500 seconds DB queried: mem: 65,428 K C:\test>1112165-sql -S=3 Start: mem: 9,656 K DB created: mem: 11,068 K DB populated: mem: 69,544 K DB indexed: mem: 92,320 K Fetch by Name took 21.599556 seconds Fetch by Addr took 21.844892 seconds DB queried: mem: 92,348 K C:\test>1112165-sql -S=4 Start: mem: 9,668 K DB created: mem: 11,084 K DB populated: mem: 88,800 K DB indexed: mem: 119,372 K Fetch by Name took 30.339751 seconds Fetch by Addr took 30.587817 seconds DB queried: mem: 119,400 K