| #!/usr/bin/perl |
| # |
| # Accepts one argument - DBMS name (pgsql, ...) and initializes |
| # global variable $TestDBMS with this name. |
| # |
| |
| # Where to run tests |
| $DBNAME = 'perftest'; |
| |
| # This describtion for all DBMS supported by test |
| # DBMS_name => [FrontEnd, DestroyDB command, CreateDB command] |
| |
| %DBMS = ( |
| 'pgsql' => ["psql -q -d $DBNAME", "destroydb $DBNAME", "createdb $DBNAME"] |
| ); |
| |
| # Tests to run: test' script, test' description, ... |
| # Test' script is in form |
| # |
| # script_name[.ntm][ T] |
| # |
| # script_name is name of file in ./sqls |
| # .ntm means that script will be used for some initialization |
| # and should not be timed: runtests.pl opens /dev/null as STDERR |
| # in this case and restore STDERR to result file after script done. |
| # Script shouldn't notice either he is running for test or for |
| # initialization purposes. |
| # T means that all queries in this test (initialization ?) are to be |
| # executed in SINGLE transaction. In this case global variable $XACTBLOCK |
| # is not empty string. Otherwise, each query in test is to be executed |
| # in own transaction ($XACTBLOCK is empty string). In accordance with |
| # $XACTBLOCK, script is to do DBMS specific preparation before execution |
| # of queries. (Look at example in sqls/inssimple for MySQL - it gives |
| # an idea of what can be done for features unsupported by an DBMS.) |
| # |
| @perftests = ( |
| # It speed up things |
| 'connection.ntm', 'DB connection startup (no timing)', |
| # Just connection startup time (echo "" | psql ... - for PgSQL) |
| 'connection', 'DB connection startup', |
| 'crtsimple.ntm', 'Create SIMPLE table (no timing)', |
| # 8192 inserts in single xaction |
| 'inssimple T', '8192 INSERTs INTO SIMPLE (1 xact)', |
| 'drpsimple.ntm', 'Drop SIMPLE table (no timing)', |
| 'crtsimple.ntm', 'Create SIMPLE table (no timing)', |
| # 8192 inserts in 8192 xactions |
| 'inssimple', '8192 INSERTs INTO SIMPLE (8192 xacts)', |
| 'vacuum.ntm', 'Vacuum (no timing)', |
| # Fast (after table filled with data) index creation test |
| 'crtsimpleidx', 'Create INDEX on SIMPLE', |
| 'drpsimple.ntm', 'Drop SIMPLE table (no timing)', |
| 'crtsimple.ntm', 'Create SIMPLE table (no timing)', |
| 'crtsimpleidx.ntm', 'Create INDEX on SIMPLE (no timing)', |
| # 8192 inserts in single xaction into table with index |
| 'inssimple T', '8192 INSERTs INTO SIMPLE with INDEX (1 xact)', |
| # 8192 SELECT * FROM simple WHERE justint = <random_key> in single xaction |
| 'slcsimple T', '8192 random INDEX scans on SIMPLE (1 xact)', |
| # SELECT * FROM simple ORDER BY justint |
| 'orbsimple', 'ORDER BY SIMPLE', |
| ); |
| |
| # |
| # It seems that nothing below need to be changed |
| # |
| |
| $TestDBMS = $ARGV[0]; |
| die "Unsupported DBMS $TestDBMS\n" if !exists $DBMS{$TestDBMS}; |
| |
| $FrontEnd = $DBMS{$TestDBMS}[0]; |
| $DestroyDB = $DBMS{$TestDBMS}[1]; |
| $CreateDB = $DBMS{$TestDBMS}[2]; |
| |
| print "(Re)create DataBase $DBNAME\n"; |
| |
| `$DestroyDB`; # Destroy DB |
| `$CreateDB`; # Create DB |
| |
| $ResFile = "Results.$TestDBMS"; |
| $TmpFile = "Tmp.$TestDBMS"; |
| |
| open (SAVEOUT, ">&STDOUT"); |
| open (STDOUT, ">/dev/null") or die; |
| open (SAVEERR, ">&STDERR"); |
| open (STDERR, ">$TmpFile") or die; |
| select (STDERR); $| = 1; |
| |
| for ($i = 0; $i <= $#perftests; $i++) |
| { |
| $test = $perftests[$i]; |
| ($test, $XACTBLOCK) = split (/ /, $test); |
| $runtest = $test; |
| if ( $test =~ /\.ntm/ ) |
| { |
| # |
| # No timing for this queries |
| # |
| close (STDERR); # close $TmpFile |
| open (STDERR, ">/dev/null") or die; |
| $runtest =~ s/\.ntm//; |
| } |
| else |
| { |
| close (STDOUT); |
| open(STDOUT, ">&SAVEOUT"); |
| print STDOUT "\nRunning: $perftests[$i+1] ..."; |
| close (STDOUT); |
| open (STDOUT, ">/dev/null") or die; |
| select (STDERR); $| = 1; |
| printf "$perftests[$i+1]: "; |
| } |
| |
| do "sqls/$runtest"; |
| |
| # Restore STDERR to $TmpFile |
| if ( $test =~ /\.ntm/ ) |
| { |
| close (STDERR); |
| open (STDERR, ">>$TmpFile") or die; |
| } |
| |
| select (STDERR); $| = 1; |
| $i++; |
| } |
| |
| close (STDERR); |
| open(STDERR, ">&SAVEERR"); |
| |
| open (TMPF, "<$TmpFile") or die; |
| open (RESF, ">$ResFile") or die; |
| |
| while (<TMPF>) |
| { |
| $str = $_; |
| ($test, $rtime) = split (/:/, $str); |
| ($tmp, $rtime, $rest) = split (/[ ]+/, $rtime); |
| print RESF "$test: $rtime\n"; |
| } |
| |