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 |
drh | 0ac6589 | 2002-04-20 14:24:41 +0000 | [diff] [blame] | 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] |
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 | 0ac6589 | 2002-04-20 14:24:41 +0000 | [diff] [blame] | 50 | set t [time "exec ./sqlite248 s2k.db <$sqlfile" 1] |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 51 | set t [expr {[lindex $t 0]/1000000.0}] |
drh | 4d908a3 | 2002-05-10 14:37:30 +0000 | [diff] [blame] | 52 | puts [format $format {SQLite 2.4.8:} $t] |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 53 | exec sync; after $delay; |
drh | 0ac6589 | 2002-04-20 14:24:41 +0000 | [diff] [blame] | 54 | set t [time "exec ./sqlite248 sns.db <$sqlfile" 1] |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 55 | set t [expr {[lindex $t 0]/1000000.0}] |
drh | 4d908a3 | 2002-05-10 14:37:30 +0000 | [diff] [blame] | 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] |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 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] |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 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] |
drh | cd61c28 | 2002-03-06 22:01:34 +0000 | [diff] [blame] | 84 | puts $fd { |
| 85 | PRAGMA default_cache_size=2000; |
| 86 | PRAGMA default_synchronous=on; |
| 87 | } |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 88 | close $fd |
drh | 0ac6589 | 2002-04-20 14:24:41 +0000 | [diff] [blame] | 89 | exec ./sqlite248 s2k.db <2kinit.sql |
drh | 4d908a3 | 2002-05-10 14:37:30 +0000 | [diff] [blame] | 90 | exec ./sqlite2412 s2kb.db <2kinit.sql |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 91 | set fd [open nosync-init.sql w] |
drh | cd61c28 | 2002-03-06 22:01:34 +0000 | [diff] [blame] | 92 | puts $fd { |
| 93 | PRAGMA default_cache_size=2000; |
| 94 | PRAGMA default_synchronous=off; |
| 95 | } |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 96 | close $fd |
drh | 0ac6589 | 2002-04-20 14:24:41 +0000 | [diff] [blame] | 97 | exec ./sqlite248 sns.db <nosync-init.sql |
drh | 4d908a3 | 2002-05-10 14:37:30 +0000 | [diff] [blame] | 98 | exec ./sqlite2412 snsb.db <nosync-init.sql |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 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 | } |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 110 | if {$n>=100} { |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 111 | append txt " [lindex $::ones [expr {$n/100}]] hundred" |
| 112 | set n [expr {$n%100}] |
| 113 | } |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 114 | if {$n>=20} { |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 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 | |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 126 | |
| 127 | |
| 128 | set fd [open test$cnt.sql w] |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 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 |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 135 | runtest {1000 INSERTs} |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 136 | |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 137 | |
| 138 | |
| 139 | set fd [open test$cnt.sql w] |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 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 |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 148 | runtest {25000 INSERTs in a transaction} |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 149 | |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 150 | |
| 151 | |
| 152 | set fd [open test$cnt.sql w] |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 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 |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 159 | runtest {100 SELECTs without an index} |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 160 | |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 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] |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 173 | puts $fd {CREATE INDEX i2a ON t2(a);} |
| 174 | puts $fd {CREATE INDEX i2b ON t2(b);} |
| 175 | close $fd |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 176 | runtest {Creating an index} |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 177 | |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 178 | |
| 179 | |
| 180 | set fd [open test$cnt.sql w] |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 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 |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 187 | runtest {5000 SELECTs with an index} |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 188 | |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 189 | |
| 190 | |
| 191 | set fd [open test$cnt.sql w] |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 192 | puts $fd "BEGIN;" |
drh | cd61c28 | 2002-03-06 22:01:34 +0000 | [diff] [blame] | 193 | for {set i 0} {$i<1000} {incr i} { |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 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 |
drh | cd61c28 | 2002-03-06 22:01:34 +0000 | [diff] [blame] | 200 | runtest {1000 UPDATEs without an index} |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 201 | |
| 202 | |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 203 | |
| 204 | set fd [open test$cnt.sql w] |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 205 | puts $fd "BEGIN;" |
| 206 | for {set i 1} {$i<=25000} {incr i} { |
drh | cd61c28 | 2002-03-06 22:01:34 +0000 | [diff] [blame] | 207 | set r [expr {int(rand()*500000)}] |
| 208 | puts $fd "UPDATE t2 SET b=$r WHERE a=$i;" |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 209 | } |
| 210 | puts $fd "COMMIT;" |
| 211 | close $fd |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 212 | runtest {25000 UPDATEs with an index} |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 213 | |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 214 | |
drh | cd61c28 | 2002-03-06 22:01:34 +0000 | [diff] [blame] | 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 | |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 226 | |
| 227 | set fd [open test$cnt.sql w] |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 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 |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 233 | runtest {INSERTs from a SELECT} |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 234 | |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 235 | |
| 236 | |
| 237 | set fd [open test$cnt.sql w] |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 238 | puts $fd {DELETE FROM t2 WHERE c LIKE '%fifty%';} |
| 239 | close $fd |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 240 | runtest {DELETE without an index} |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 241 | |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 242 | |
| 243 | |
| 244 | set fd [open test$cnt.sql w] |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 245 | puts $fd {DELETE FROM t2 WHERE a>10 AND a<20000;} |
| 246 | close $fd |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 247 | runtest {DELETE with an index} |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 248 | |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 249 | |
| 250 | |
| 251 | set fd [open test$cnt.sql w] |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 252 | puts $fd {INSERT INTO t2 SELECT * FROM t1;} |
| 253 | close $fd |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 254 | runtest {A big INSERT after a big DELETE} |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 255 | |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 256 | |
| 257 | |
| 258 | set fd [open test$cnt.sql w] |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 259 | puts $fd {BEGIN;} |
| 260 | puts $fd {DELETE FROM t1;} |
drh | cd61c28 | 2002-03-06 22:01:34 +0000 | [diff] [blame] | 261 | for {set i 1} {$i<=3000} {incr i} { |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 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 |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 267 | runtest {A big DELETE followed by many small INSERTs} |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 268 | |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 269 | |
| 270 | |
| 271 | set fd [open test$cnt.sql w] |
drh | 603240c | 2002-03-05 01:11:12 +0000 | [diff] [blame] | 272 | puts $fd {DROP TABLE t1;} |
| 273 | puts $fd {DROP TABLE t2;} |
| 274 | close $fd |
drh | 4b845d7 | 2002-03-05 12:41:19 +0000 | [diff] [blame] | 275 | runtest {DROP TABLE} |