Home | History | Annotate | Download | only in tool
      1 #!/usr/bin/tclsh
      2 #
      3 # Run this script using TCLSH to do a speed comparison between
      4 # various versions of SQLite and PostgreSQL and MySQL
      5 #
      6 
      7 # Run a test
      8 #
      9 set cnt 1
     10 proc runtest {title} {
     11   global cnt
     12   set sqlfile test$cnt.sql
     13   puts "<h2>Test $cnt: $title</h2>"
     14   incr cnt
     15   set fd [open $sqlfile r]
     16   set sql [string trim [read $fd [file size $sqlfile]]]
     17   close $fd
     18   set sx [split $sql \n]
     19   set n [llength $sx]
     20   if {$n>8} {
     21     set sql {}
     22     for {set i 0} {$i<3} {incr i} {append sql [lindex $sx $i]<br>\n}
     23     append sql  "<i>... [expr {$n-6}] lines omitted</i><br>\n"
     24     for {set i [expr {$n-3}]} {$i<$n} {incr i} {
     25       append sql [lindex $sx $i]<br>\n
     26     }
     27   } else {
     28     regsub -all \n [string trim $sql] <br> sql
     29   }
     30   puts "<blockquote>"
     31   puts "$sql"
     32   puts "</blockquote><table border=0 cellpadding=0 cellspacing=0>"
     33   set format {<tr><td>%s</td><td align="right">&nbsp;&nbsp;&nbsp;%.3f</td></tr>}
     34   set delay 1000
     35 #  exec sync; after $delay;
     36 #  set t [time "exec psql drh <$sqlfile" 1]
     37 #  set t [expr {[lindex $t 0]/1000000.0}]
     38 #  puts [format $format PostgreSQL: $t]
     39   exec sync; after $delay;
     40   set t [time "exec mysql -f drh <$sqlfile" 1]
     41   set t [expr {[lindex $t 0]/1000000.0}]
     42   puts [format $format MySQL: $t]
     43 #  set t [time "exec ./sqlite232 s232.db <$sqlfile" 1]
     44 #  set t [expr {[lindex $t 0]/1000000.0}]
     45 #  puts [format $format {SQLite 2.3.2:} $t]
     46 #  set t [time "exec ./sqlite-100 s100.db <$sqlfile" 1]
     47 #  set t [expr {[lindex $t 0]/1000000.0}]
     48 #  puts [format $format {SQLite 2.4 (cache=100):} $t]
     49   exec sync; after $delay;
     50   set t [time "exec ./sqlite248 s2k.db <$sqlfile" 1]
     51   set t [expr {[lindex $t 0]/1000000.0}]
     52   puts [format $format {SQLite 2.4.8:} $t]
     53   exec sync; after $delay;
     54   set t [time "exec ./sqlite248 sns.db <$sqlfile" 1]
     55   set t [expr {[lindex $t 0]/1000000.0}]
     56   puts [format $format {SQLite 2.4.8 (nosync):} $t]
     57   exec sync; after $delay;
     58   set t [time "exec ./sqlite2412 s2kb.db <$sqlfile" 1]
     59   set t [expr {[lindex $t 0]/1000000.0}]
     60   puts [format $format {SQLite 2.4.12:} $t]
     61   exec sync; after $delay;
     62   set t [time "exec ./sqlite2412 snsb.db <$sqlfile" 1]
     63   set t [expr {[lindex $t 0]/1000000.0}]
     64   puts [format $format {SQLite 2.4.12 (nosync):} $t]
     65 #  set t [time "exec ./sqlite-t1 st1.db <$sqlfile" 1]
     66 #  set t [expr {[lindex $t 0]/1000000.0}]
     67 #  puts [format $format {SQLite 2.4 (test):} $t]
     68   puts "</table>"
     69 }
     70 
     71 # Initialize the environment
     72 #
     73 expr srand(1)
     74 catch {exec /bin/sh -c {rm -f s*.db}}
     75 set fd [open clear.sql w]
     76 puts $fd {
     77   drop table t1;
     78   drop table t2;
     79 }
     80 close $fd
     81 catch {exec psql drh <clear.sql}
     82 catch {exec mysql drh <clear.sql}
     83 set fd [open 2kinit.sql w]
     84 puts $fd {
     85   PRAGMA default_cache_size=2000;
     86   PRAGMA default_synchronous=on;
     87 }
     88 close $fd
     89 exec ./sqlite248 s2k.db <2kinit.sql
     90 exec ./sqlite2412 s2kb.db <2kinit.sql
     91 set fd [open nosync-init.sql w]
     92 puts $fd {
     93   PRAGMA default_cache_size=2000;
     94   PRAGMA default_synchronous=off;
     95 }
     96 close $fd
     97 exec ./sqlite248 sns.db <nosync-init.sql
     98 exec ./sqlite2412 snsb.db <nosync-init.sql
     99 set ones {zero one two three four five six seven eight nine
    100           ten eleven twelve thirteen fourteen fifteen sixteen seventeen
    101           eighteen nineteen}
    102 set tens {{} ten twenty thirty forty fifty sixty seventy eighty ninety}
    103 proc number_name {n} {
    104   if {$n>=1000} {
    105     set txt "[number_name [expr {$n/1000}]] thousand"
    106     set n [expr {$n%1000}]
    107   } else {
    108     set txt {}
    109   }
    110   if {$n>=100} {
    111     append txt " [lindex $::ones [expr {$n/100}]] hundred"
    112     set n [expr {$n%100}]
    113   }
    114   if {$n>=20} {
    115     append txt " [lindex $::tens [expr {$n/10}]]"
    116     set n [expr {$n%10}]
    117   }
    118   if {$n>0} {
    119     append txt " [lindex $::ones $n]"
    120   }
    121   set txt [string trim $txt]
    122   if {$txt==""} {set txt zero}
    123   return $txt
    124 }
    125 
    126 
    127 
    128 set fd [open test$cnt.sql w]
    129 puts $fd "CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100));"
    130 for {set i 1} {$i<=1000} {incr i} {
    131   set r [expr {int(rand()*100000)}]
    132   puts $fd "INSERT INTO t1 VALUES($i,$r,'[number_name $r]');"
    133 }
    134 close $fd
    135 runtest {1000 INSERTs}
    136 
    137 
    138 
    139 set fd [open test$cnt.sql w]
    140 puts $fd "BEGIN;"
    141 puts $fd "CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100));"
    142 for {set i 1} {$i<=25000} {incr i} {
    143   set r [expr {int(rand()*500000)}]
    144   puts $fd "INSERT INTO t2 VALUES($i,$r,'[number_name $r]');"
    145 }
    146 puts $fd "COMMIT;"
    147 close $fd
    148 runtest {25000 INSERTs in a transaction}
    149 
    150 
    151 
    152 set fd [open test$cnt.sql w]
    153 for {set i 0} {$i<100} {incr i} {
    154   set lwr [expr {$i*100}]
    155   set upr [expr {($i+10)*100}]
    156   puts $fd "SELECT count(*), avg(b) FROM t2 WHERE b>=$lwr AND b<$upr;"
    157 }
    158 close $fd
    159 runtest {100 SELECTs without an index}
    160 
    161 
    162 
    163 set fd [open test$cnt.sql w]
    164 for {set i 1} {$i<=100} {incr i} {
    165   puts $fd "SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%[number_name $i]%';"
    166 }
    167 close $fd
    168 runtest {100 SELECTs on a string comparison}
    169 
    170 
    171 
    172 set fd [open test$cnt.sql w]
    173 puts $fd {CREATE INDEX i2a ON t2(a);}
    174 puts $fd {CREATE INDEX i2b ON t2(b);}
    175 close $fd
    176 runtest {Creating an index}
    177 
    178 
    179 
    180 set fd [open test$cnt.sql w]
    181 for {set i 0} {$i<5000} {incr i} {
    182   set lwr [expr {$i*100}]
    183   set upr [expr {($i+1)*100}]
    184   puts $fd "SELECT count(*), avg(b) FROM t2 WHERE b>=$lwr AND b<$upr;"
    185 }
    186 close $fd
    187 runtest {5000 SELECTs with an index}
    188 
    189 
    190 
    191 set fd [open test$cnt.sql w]
    192 puts $fd "BEGIN;"
    193 for {set i 0} {$i<1000} {incr i} {
    194   set lwr [expr {$i*10}]
    195   set upr [expr {($i+1)*10}]
    196   puts $fd "UPDATE t1 SET b=b*2 WHERE a>=$lwr AND a<$upr;"
    197 }
    198 puts $fd "COMMIT;"
    199 close $fd
    200 runtest {1000 UPDATEs without an index}
    201 
    202 
    203 
    204 set fd [open test$cnt.sql w]
    205 puts $fd "BEGIN;"
    206 for {set i 1} {$i<=25000} {incr i} {
    207   set r [expr {int(rand()*500000)}]
    208   puts $fd "UPDATE t2 SET b=$r WHERE a=$i;"
    209 }
    210 puts $fd "COMMIT;"
    211 close $fd
    212 runtest {25000 UPDATEs with an index}
    213 
    214 
    215 set fd [open test$cnt.sql w]
    216 puts $fd "BEGIN;"
    217 for {set i 1} {$i<=25000} {incr i} {
    218   set r [expr {int(rand()*500000)}]
    219   puts $fd "UPDATE t2 SET c='[number_name $r]' WHERE a=$i;"
    220 }
    221 puts $fd "COMMIT;"
    222 close $fd
    223 runtest {25000 text UPDATEs with an index}
    224 
    225 
    226 
    227 set fd [open test$cnt.sql w]
    228 puts $fd "BEGIN;"
    229 puts $fd "INSERT INTO t1 SELECT * FROM t2;"
    230 puts $fd "INSERT INTO t2 SELECT * FROM t1;"
    231 puts $fd "COMMIT;"
    232 close $fd
    233 runtest {INSERTs from a SELECT}
    234 
    235 
    236 
    237 set fd [open test$cnt.sql w]
    238 puts $fd {DELETE FROM t2 WHERE c LIKE '%fifty%';}
    239 close $fd
    240 runtest {DELETE without an index}
    241 
    242 
    243 
    244 set fd [open test$cnt.sql w]
    245 puts $fd {DELETE FROM t2 WHERE a>10 AND a<20000;}
    246 close $fd
    247 runtest {DELETE with an index}
    248 
    249 
    250 
    251 set fd [open test$cnt.sql w]
    252 puts $fd {INSERT INTO t2 SELECT * FROM t1;}
    253 close $fd
    254 runtest {A big INSERT after a big DELETE}
    255 
    256 
    257 
    258 set fd [open test$cnt.sql w]
    259 puts $fd {BEGIN;}
    260 puts $fd {DELETE FROM t1;}
    261 for {set i 1} {$i<=3000} {incr i} {
    262   set r [expr {int(rand()*100000)}]
    263   puts $fd "INSERT INTO t1 VALUES($i,$r,'[number_name $r]');"
    264 }
    265 puts $fd {COMMIT;}
    266 close $fd
    267 runtest {A big DELETE followed by many small INSERTs}
    268 
    269 
    270 
    271 set fd [open test$cnt.sql w]
    272 puts $fd {DROP TABLE t1;}
    273 puts $fd {DROP TABLE t2;}
    274 close $fd
    275 runtest {DROP TABLE}
    276