blob: 7090e2e4258f5fa3c3fb7beebae587e966e345b7 [file] [log] [blame]
drh603240c2002-03-05 01:11:12 +00001#!/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#
drh4b845d72002-03-05 12:41:19 +00009set cnt 1
10proc runtest {title} {
drh603240c2002-03-05 01:11:12 +000011 global cnt
drh4b845d72002-03-05 12:41:19 +000012 set sqlfile test$cnt.sql
drh603240c2002-03-05 01:11:12 +000013 puts "<h2>Test $cnt: $title</h2>"
drh4b845d72002-03-05 12:41:19 +000014 incr cnt
drh603240c2002-03-05 01:11:12 +000015 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"
drh4b845d72002-03-05 12:41:19 +000032 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;
drh603240c2002-03-05 01:11:12 +000036 set t [time "exec psql drh <$sqlfile" 1]
37 set t [expr {[lindex $t 0]/1000000.0}]
38 puts [format $format PostgreSQL: $t]
drh4b845d72002-03-05 12:41:19 +000039 exec sync; after $delay;
drhcd61c282002-03-06 22:01:34 +000040 set t [time "exec mysql -f drh <$sqlfile" 1]
41 set t [expr {[lindex $t 0]/1000000.0}]
42 puts [format $format MySQL: $t]
drh603240c2002-03-05 01:11:12 +000043# 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]
drh4b845d72002-03-05 12:41:19 +000049 exec sync; after $delay;
drh603240c2002-03-05 01:11:12 +000050 set t [time "exec ./sqlite240 s2k.db <$sqlfile" 1]
51 set t [expr {[lindex $t 0]/1000000.0}]
drh4b845d72002-03-05 12:41:19 +000052 puts [format $format {SQLite 2.4:} $t]
53 exec sync; after $delay;
drh603240c2002-03-05 01:11:12 +000054 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]
drh4b845d72002-03-05 12:41:19 +000057# 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]
drh603240c2002-03-05 01:11:12 +000060 puts "</table>"
61}
62
63# Initialize the environment
64#
65expr srand(1)
66catch {exec /bin/sh -c {rm -f s*.db}}
67set fd [open clear.sql w]
68puts $fd {
69 drop table t1;
70 drop table t2;
71}
72close $fd
73catch {exec psql drh <clear.sql}
74catch {exec mysql drh <clear.sql}
75set fd [open 2kinit.sql w]
drhcd61c282002-03-06 22:01:34 +000076puts $fd {
77 PRAGMA default_cache_size=2000;
78 PRAGMA default_synchronous=on;
79}
drh603240c2002-03-05 01:11:12 +000080close $fd
81exec ./sqlite240 s2k.db <2kinit.sql
82set fd [open nosync-init.sql w]
drhcd61c282002-03-06 22:01:34 +000083puts $fd {
84 PRAGMA default_cache_size=2000;
85 PRAGMA default_synchronous=off;
86}
drh603240c2002-03-05 01:11:12 +000087close $fd
88exec ./sqlite240 sns.db <nosync-init.sql
89set ones {zero one two three four five six seven eight nine
90 ten eleven twelve thirteen fourteen fifteen sixteen seventeen
91 eighteen nineteen}
92set tens {{} ten twenty thirty forty fifty sixty seventy eighty ninety}
93proc 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 }
drh4b845d72002-03-05 12:41:19 +0000100 if {$n>=100} {
drh603240c2002-03-05 01:11:12 +0000101 append txt " [lindex $::ones [expr {$n/100}]] hundred"
102 set n [expr {$n%100}]
103 }
drh4b845d72002-03-05 12:41:19 +0000104 if {$n>=20} {
drh603240c2002-03-05 01:11:12 +0000105 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
drh4b845d72002-03-05 12:41:19 +0000116
117
118set fd [open test$cnt.sql w]
drh603240c2002-03-05 01:11:12 +0000119puts $fd "CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100));"
120for {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}
124close $fd
drh4b845d72002-03-05 12:41:19 +0000125runtest {1000 INSERTs}
drh603240c2002-03-05 01:11:12 +0000126
drh4b845d72002-03-05 12:41:19 +0000127
128
129set fd [open test$cnt.sql w]
drh603240c2002-03-05 01:11:12 +0000130puts $fd "BEGIN;"
131puts $fd "CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100));"
132for {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}
136puts $fd "COMMIT;"
137close $fd
drh4b845d72002-03-05 12:41:19 +0000138runtest {25000 INSERTs in a transaction}
drh603240c2002-03-05 01:11:12 +0000139
drh4b845d72002-03-05 12:41:19 +0000140
141
142set fd [open test$cnt.sql w]
drh603240c2002-03-05 01:11:12 +0000143for {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}
148close $fd
drh4b845d72002-03-05 12:41:19 +0000149runtest {100 SELECTs without an index}
drh603240c2002-03-05 01:11:12 +0000150
drh4b845d72002-03-05 12:41:19 +0000151
152
153set fd [open test$cnt.sql w]
154for {set i 1} {$i<=100} {incr i} {
155 puts $fd "SELECT count(*), avg(b) FROM t2 WHERE c LIKE '%[number_name $i]%';"
156}
157close $fd
158runtest {100 SELECTs on a string comparison}
159
160
161
162set fd [open test$cnt.sql w]
drh603240c2002-03-05 01:11:12 +0000163puts $fd {CREATE INDEX i2a ON t2(a);}
164puts $fd {CREATE INDEX i2b ON t2(b);}
165close $fd
drh4b845d72002-03-05 12:41:19 +0000166runtest {Creating an index}
drh603240c2002-03-05 01:11:12 +0000167
drh4b845d72002-03-05 12:41:19 +0000168
169
170set fd [open test$cnt.sql w]
drh603240c2002-03-05 01:11:12 +0000171for {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}
176close $fd
drh4b845d72002-03-05 12:41:19 +0000177runtest {5000 SELECTs with an index}
drh603240c2002-03-05 01:11:12 +0000178
drh4b845d72002-03-05 12:41:19 +0000179
180
181set fd [open test$cnt.sql w]
drh603240c2002-03-05 01:11:12 +0000182puts $fd "BEGIN;"
drhcd61c282002-03-06 22:01:34 +0000183for {set i 0} {$i<1000} {incr i} {
drh603240c2002-03-05 01:11:12 +0000184 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}
188puts $fd "COMMIT;"
189close $fd
drhcd61c282002-03-06 22:01:34 +0000190runtest {1000 UPDATEs without an index}
drh603240c2002-03-05 01:11:12 +0000191
192
drh4b845d72002-03-05 12:41:19 +0000193
194set fd [open test$cnt.sql w]
drh603240c2002-03-05 01:11:12 +0000195puts $fd "BEGIN;"
196for {set i 1} {$i<=25000} {incr i} {
drhcd61c282002-03-06 22:01:34 +0000197 set r [expr {int(rand()*500000)}]
198 puts $fd "UPDATE t2 SET b=$r WHERE a=$i;"
drh603240c2002-03-05 01:11:12 +0000199}
200puts $fd "COMMIT;"
201close $fd
drh4b845d72002-03-05 12:41:19 +0000202runtest {25000 UPDATEs with an index}
drh603240c2002-03-05 01:11:12 +0000203
drh4b845d72002-03-05 12:41:19 +0000204
drhcd61c282002-03-06 22:01:34 +0000205set fd [open test$cnt.sql w]
206puts $fd "BEGIN;"
207for {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}
211puts $fd "COMMIT;"
212close $fd
213runtest {25000 text UPDATEs with an index}
214
215
drh4b845d72002-03-05 12:41:19 +0000216
217set fd [open test$cnt.sql w]
drh603240c2002-03-05 01:11:12 +0000218puts $fd "BEGIN;"
219puts $fd "INSERT INTO t1 SELECT * FROM t2;"
220puts $fd "INSERT INTO t2 SELECT * FROM t1;"
221puts $fd "COMMIT;"
222close $fd
drh4b845d72002-03-05 12:41:19 +0000223runtest {INSERTs from a SELECT}
drh603240c2002-03-05 01:11:12 +0000224
drh4b845d72002-03-05 12:41:19 +0000225
226
227set fd [open test$cnt.sql w]
drh603240c2002-03-05 01:11:12 +0000228puts $fd {DELETE FROM t2 WHERE c LIKE '%fifty%';}
229close $fd
drh4b845d72002-03-05 12:41:19 +0000230runtest {DELETE without an index}
drh603240c2002-03-05 01:11:12 +0000231
drh4b845d72002-03-05 12:41:19 +0000232
233
234set fd [open test$cnt.sql w]
drh603240c2002-03-05 01:11:12 +0000235puts $fd {DELETE FROM t2 WHERE a>10 AND a<20000;}
236close $fd
drh4b845d72002-03-05 12:41:19 +0000237runtest {DELETE with an index}
drh603240c2002-03-05 01:11:12 +0000238
drh4b845d72002-03-05 12:41:19 +0000239
240
241set fd [open test$cnt.sql w]
drh603240c2002-03-05 01:11:12 +0000242puts $fd {INSERT INTO t2 SELECT * FROM t1;}
243close $fd
drh4b845d72002-03-05 12:41:19 +0000244runtest {A big INSERT after a big DELETE}
drh603240c2002-03-05 01:11:12 +0000245
drh4b845d72002-03-05 12:41:19 +0000246
247
248set fd [open test$cnt.sql w]
drh603240c2002-03-05 01:11:12 +0000249puts $fd {BEGIN;}
250puts $fd {DELETE FROM t1;}
drhcd61c282002-03-06 22:01:34 +0000251for {set i 1} {$i<=3000} {incr i} {
drh603240c2002-03-05 01:11:12 +0000252 set r [expr {int(rand()*100000)}]
253 puts $fd "INSERT INTO t1 VALUES($i,$r,'[number_name $r]');"
254}
255puts $fd {COMMIT;}
256close $fd
drh4b845d72002-03-05 12:41:19 +0000257runtest {A big DELETE followed by many small INSERTs}
drh603240c2002-03-05 01:11:12 +0000258
drh4b845d72002-03-05 12:41:19 +0000259
260
261set fd [open test$cnt.sql w]
drh603240c2002-03-05 01:11:12 +0000262puts $fd {DROP TABLE t1;}
263puts $fd {DROP TABLE t2;}
264close $fd
drh4b845d72002-03-05 12:41:19 +0000265runtest {DROP TABLE}