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