1*c5c4113dSnw141292 2*c5c4113dSnw141292#pragma ident "%Z%%M% %I% %E% SMI" 3*c5c4113dSnw141292 4*c5c4113dSnw141292#!/usr/bin/tclsh 5*c5c4113dSnw141292# 6*c5c4113dSnw141292# Run this script using TCLSH to do a speed comparison between 7*c5c4113dSnw141292# various versions of SQLite and PostgreSQL and MySQL 8*c5c4113dSnw141292# 9*c5c4113dSnw141292 10*c5c4113dSnw141292# Run a test 11*c5c4113dSnw141292# 12*c5c4113dSnw141292set cnt 1 13*c5c4113dSnw141292proc runtest {title} { 14*c5c4113dSnw141292 global cnt 15*c5c4113dSnw141292 set sqlfile test$cnt.sql 16*c5c4113dSnw141292 puts "<h2>Test $cnt: $title</h2>" 17*c5c4113dSnw141292 incr cnt 18*c5c4113dSnw141292 set fd [open $sqlfile r] 19*c5c4113dSnw141292 set sql [string trim [read $fd [file size $sqlfile]]] 20*c5c4113dSnw141292 close $fd 21*c5c4113dSnw141292 set sx [split $sql \n] 22*c5c4113dSnw141292 set n [llength $sx] 23*c5c4113dSnw141292 if {$n>8} { 24*c5c4113dSnw141292 set sql {} 25*c5c4113dSnw141292 for {set i 0} {$i<3} {incr i} {append sql [lindex $sx $i]<br>\n} 26*c5c4113dSnw141292 append sql "<i>... [expr {$n-6}] lines omitted</i><br>\n" 27*c5c4113dSnw141292 for {set i [expr {$n-3}]} {$i<$n} {incr i} { 28*c5c4113dSnw141292 append sql [lindex $sx $i]<br>\n 29*c5c4113dSnw141292 } 30*c5c4113dSnw141292 } else { 31*c5c4113dSnw141292 regsub -all \n [string trim $sql] <br> sql 32*c5c4113dSnw141292 } 33*c5c4113dSnw141292 puts "<blockquote>" 34*c5c4113dSnw141292 puts "$sql" 35*c5c4113dSnw141292 puts "</blockquote><table border=0 cellpadding=0 cellspacing=0>" 36*c5c4113dSnw141292 set format {<tr><td>%s</td><td align="right"> %.3f</td></tr>} 37*c5c4113dSnw141292 set delay 1000 38*c5c4113dSnw141292 exec sync; after $delay; 39*c5c4113dSnw141292 set t [time "exec psql drh <$sqlfile" 1] 40*c5c4113dSnw141292 set t [expr {[lindex $t 0]/1000000.0}] 41*c5c4113dSnw141292 puts [format $format PostgreSQL: $t] 42*c5c4113dSnw141292 exec sync; after $delay; 43*c5c4113dSnw141292 set t [time "exec mysql -f drh <$sqlfile" 1] 44*c5c4113dSnw141292 set t [expr {[lindex $t 0]/1000000.0}] 45*c5c4113dSnw141292 puts [format $format MySQL: $t] 46*c5c4113dSnw141292# set t [time "exec ./sqlite232 s232.db <$sqlfile" 1] 47*c5c4113dSnw141292# set t [expr {[lindex $t 0]/1000000.0}] 48*c5c4113dSnw141292# puts [format $format {SQLite 2.3.2:} $t] 49*c5c4113dSnw141292# set t [time "exec ./sqlite-100 s100.db <$sqlfile" 1] 50*c5c4113dSnw141292# set t [expr {[lindex $t 0]/1000000.0}] 51*c5c4113dSnw141292# puts [format $format {SQLite 2.4 (cache=100):} $t] 52*c5c4113dSnw141292 exec sync; after $delay; 53*c5c4113dSnw141292 set t [time "exec ./sqlite240 s2k.db <$sqlfile" 1] 54*c5c4113dSnw141292 set t [expr {[lindex $t 0]/1000000.0}] 55*c5c4113dSnw141292 puts [format $format {SQLite 2.4:} $t] 56*c5c4113dSnw141292 exec sync; after $delay; 57*c5c4113dSnw141292 set t [time "exec ./sqlite240 sns.db <$sqlfile" 1] 58*c5c4113dSnw141292 set t [expr {[lindex $t 0]/1000000.0}] 59*c5c4113dSnw141292 puts [format $format {SQLite 2.4 (nosync):} $t] 60*c5c4113dSnw141292# set t [time "exec ./sqlite-t1 st1.db <$sqlfile" 1] 61*c5c4113dSnw141292# set t [expr {[lindex $t 0]/1000000.0}] 62*c5c4113dSnw141292# puts [format $format {SQLite 2.4 (test):} $t] 63*c5c4113dSnw141292 puts "</table>" 64*c5c4113dSnw141292} 65*c5c4113dSnw141292 66*c5c4113dSnw141292# Initialize the environment 67*c5c4113dSnw141292# 68*c5c4113dSnw141292expr srand(1) 69*c5c4113dSnw141292catch {exec /bin/sh -c {rm -f s*.db}} 70*c5c4113dSnw141292set fd [open clear.sql w] 71*c5c4113dSnw141292puts $fd { 72*c5c4113dSnw141292 drop table t1; 73*c5c4113dSnw141292 drop table t2; 74*c5c4113dSnw141292} 75*c5c4113dSnw141292close $fd 76*c5c4113dSnw141292catch {exec psql drh <clear.sql} 77*c5c4113dSnw141292catch {exec mysql drh <clear.sql} 78*c5c4113dSnw141292set fd [open 2kinit.sql w] 79*c5c4113dSnw141292puts $fd { 80*c5c4113dSnw141292 PRAGMA default_cache_size=2000; 81*c5c4113dSnw141292 PRAGMA default_synchronous=on; 82*c5c4113dSnw141292} 83*c5c4113dSnw141292close $fd 84*c5c4113dSnw141292exec ./sqlite240 s2k.db <2kinit.sql 85*c5c4113dSnw141292exec ./sqlite-t1 st1.db <2kinit.sql 86*c5c4113dSnw141292set fd [open nosync-init.sql w] 87*c5c4113dSnw141292puts $fd { 88*c5c4113dSnw141292 PRAGMA default_cache_size=2000; 89*c5c4113dSnw141292 PRAGMA default_synchronous=off; 90*c5c4113dSnw141292} 91*c5c4113dSnw141292close $fd 92*c5c4113dSnw141292exec ./sqlite240 sns.db <nosync-init.sql 93*c5c4113dSnw141292set ones {zero one two three four five six seven eight nine 94*c5c4113dSnw141292 ten eleven twelve thirteen fourteen fifteen sixteen seventeen 95*c5c4113dSnw141292 eighteen nineteen} 96*c5c4113dSnw141292set tens {{} ten twenty thirty forty fifty sixty seventy eighty ninety} 97*c5c4113dSnw141292proc number_name {n} { 98*c5c4113dSnw141292 if {$n>=1000} { 99*c5c4113dSnw141292 set txt "[number_name [expr {$n/1000}]] thousand" 100*c5c4113dSnw141292 set n [expr {$n%1000}] 101*c5c4113dSnw141292 } else { 102*c5c4113dSnw141292 set txt {} 103*c5c4113dSnw141292 } 104*c5c4113dSnw141292 if {$n>=100} { 105*c5c4113dSnw141292 append txt " [lindex $::ones [expr {$n/100}]] hundred" 106*c5c4113dSnw141292 set n [expr {$n%100}] 107*c5c4113dSnw141292 } 108*c5c4113dSnw141292 if {$n>=20} { 109*c5c4113dSnw141292 append txt " [lindex $::tens [expr {$n/10}]]" 110*c5c4113dSnw141292 set n [expr {$n%10}] 111*c5c4113dSnw141292 } 112*c5c4113dSnw141292 if {$n>0} { 113*c5c4113dSnw141292 append txt " [lindex $::ones $n]" 114*c5c4113dSnw141292 } 115*c5c4113dSnw141292 set txt [string trim $txt] 116*c5c4113dSnw141292 if {$txt==""} {set txt zero} 117*c5c4113dSnw141292 return $txt 118*c5c4113dSnw141292} 119*c5c4113dSnw141292 120*c5c4113dSnw141292 121*c5c4113dSnw141292set fd [open test$cnt.sql w] 122*c5c4113dSnw141292puts $fd "BEGIN;" 123*c5c4113dSnw141292puts $fd "CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100));" 124*c5c4113dSnw141292for {set i 1} {$i<=25000} {incr i} { 125*c5c4113dSnw141292 set r [expr {int(rand()*500000)}] 126*c5c4113dSnw141292 puts $fd "INSERT INTO t1 VALUES($i,$r,'[number_name $r]');" 127*c5c4113dSnw141292} 128*c5c4113dSnw141292puts $fd "COMMIT;" 129*c5c4113dSnw141292close $fd 130*c5c4113dSnw141292runtest {25000 INSERTs in a transaction} 131*c5c4113dSnw141292 132*c5c4113dSnw141292 133*c5c4113dSnw141292set fd [open test$cnt.sql w] 134*c5c4113dSnw141292puts $fd "DELETE FROM t1;" 135*c5c4113dSnw141292close $fd 136*c5c4113dSnw141292runtest {DELETE everything} 137*c5c4113dSnw141292 138*c5c4113dSnw141292 139*c5c4113dSnw141292set fd [open test$cnt.sql w] 140*c5c4113dSnw141292puts $fd "BEGIN;" 141*c5c4113dSnw141292for {set i 1} {$i<=25000} {incr i} { 142*c5c4113dSnw141292 set r [expr {int(rand()*500000)}] 143*c5c4113dSnw141292 puts $fd "INSERT INTO t1 VALUES($i,$r,'[number_name $r]');" 144*c5c4113dSnw141292} 145*c5c4113dSnw141292puts $fd "COMMIT;" 146*c5c4113dSnw141292close $fd 147*c5c4113dSnw141292runtest {25000 INSERTs in a transaction} 148*c5c4113dSnw141292 149*c5c4113dSnw141292 150*c5c4113dSnw141292set fd [open test$cnt.sql w] 151*c5c4113dSnw141292puts $fd "DELETE FROM t1;" 152*c5c4113dSnw141292close $fd 153*c5c4113dSnw141292runtest {DELETE everything} 154*c5c4113dSnw141292 155*c5c4113dSnw141292 156*c5c4113dSnw141292set fd [open test$cnt.sql w] 157*c5c4113dSnw141292puts $fd "BEGIN;" 158*c5c4113dSnw141292for {set i 1} {$i<=25000} {incr i} { 159*c5c4113dSnw141292 set r [expr {int(rand()*500000)}] 160*c5c4113dSnw141292 puts $fd "INSERT INTO t1 VALUES($i,$r,'[number_name $r]');" 161*c5c4113dSnw141292} 162*c5c4113dSnw141292puts $fd "COMMIT;" 163*c5c4113dSnw141292close $fd 164*c5c4113dSnw141292runtest {25000 INSERTs in a transaction} 165*c5c4113dSnw141292 166*c5c4113dSnw141292 167*c5c4113dSnw141292set fd [open test$cnt.sql w] 168*c5c4113dSnw141292puts $fd "DELETE FROM t1;" 169*c5c4113dSnw141292close $fd 170*c5c4113dSnw141292runtest {DELETE everything} 171*c5c4113dSnw141292 172*c5c4113dSnw141292 173*c5c4113dSnw141292set fd [open test$cnt.sql w] 174*c5c4113dSnw141292puts $fd "BEGIN;" 175*c5c4113dSnw141292for {set i 1} {$i<=25000} {incr i} { 176*c5c4113dSnw141292 set r [expr {int(rand()*500000)}] 177*c5c4113dSnw141292 puts $fd "INSERT INTO t1 VALUES($i,$r,'[number_name $r]');" 178*c5c4113dSnw141292} 179*c5c4113dSnw141292puts $fd "COMMIT;" 180*c5c4113dSnw141292close $fd 181*c5c4113dSnw141292runtest {25000 INSERTs in a transaction} 182*c5c4113dSnw141292 183*c5c4113dSnw141292 184*c5c4113dSnw141292set fd [open test$cnt.sql w] 185*c5c4113dSnw141292puts $fd "DELETE FROM t1;" 186*c5c4113dSnw141292close $fd 187*c5c4113dSnw141292runtest {DELETE everything} 188*c5c4113dSnw141292 189*c5c4113dSnw141292 190*c5c4113dSnw141292set fd [open test$cnt.sql w] 191*c5c4113dSnw141292puts $fd "BEGIN;" 192*c5c4113dSnw141292for {set i 1} {$i<=25000} {incr i} { 193*c5c4113dSnw141292 set r [expr {int(rand()*500000)}] 194*c5c4113dSnw141292 puts $fd "INSERT INTO t1 VALUES($i,$r,'[number_name $r]');" 195*c5c4113dSnw141292} 196*c5c4113dSnw141292puts $fd "COMMIT;" 197*c5c4113dSnw141292close $fd 198*c5c4113dSnw141292runtest {25000 INSERTs in a transaction} 199*c5c4113dSnw141292 200*c5c4113dSnw141292 201*c5c4113dSnw141292set fd [open test$cnt.sql w] 202*c5c4113dSnw141292puts $fd "DELETE FROM t1;" 203*c5c4113dSnw141292close $fd 204*c5c4113dSnw141292runtest {DELETE everything} 205*c5c4113dSnw141292 206*c5c4113dSnw141292 207*c5c4113dSnw141292set fd [open test$cnt.sql w] 208*c5c4113dSnw141292puts $fd {DROP TABLE t1;} 209*c5c4113dSnw141292close $fd 210*c5c4113dSnw141292runtest {DROP TABLE} 211