2002-03-05 01:11:12 +00:00
# !/usr/bin/tclsh
#
# Run this script using TCLSH to do a speed comparison between
# various versions of SQLite and PostgreSQL and MySQL
#
# Run a test
#
2002-03-05 12:41:19 +00:00
set cnt 1
proc runtest { title } {
2002-03-05 01:11:12 +00:00
global cnt
2002-03-05 12:41:19 +00:00
set sqlfile test$cnt.sql
2002-03-05 01:11:12 +00:00
puts " < h 2 > T e s t $ c n t : $ t i t l e < / h 2 > "
2002-03-05 12:41:19 +00:00
incr cnt
2002-03-05 01:11:12 +00:00
set fd [ open $sqlfile r]
set sql [ string trim [ read $fd [ file size $sqlfile ] ] ]
close $fd
set sx [ split $sql \ n]
set n [ llength $sx ]
if { $n > 8 } {
set sql { }
for { set i 0 } { $i < 3 } { incr i} { append sql [ lindex $sx $i ] < br> \ n}
append sql " < i > . . . [ e x p r { $ n - 6 } ] l i n e s o m i t t e d < / i > < b r > \n "
for { set i [ expr { $n-3 } ] } { $i < $n } { incr i} {
append sql [ lindex $sx $i ] < br> \ n
}
} else {
regsub - all \ n [ string trim $sql ] < br> sql
}
puts " < b l o c k q u o t e > "
puts " $ s q l "
2002-03-05 12:41:19 +00:00
puts " < / b l o c k q u o t e > < t a b l e b o r d e r = 0 c e l l p a d d i n g = 0 c e l l s p a c i n g = 0 > "
set format { < tr > < td> % s< / td> < td align= " r i g h t " > & nbsp; & nbsp ; & nbsp ; % .3f < / td> < / tr> }
set delay 1000
2002-04-20 14:24:41 +00:00
# exec sync; after $delay;
# set t [time "exec psql drh <$sqlfile" 1]
# set t [expr {[lindex $t 0]/1000000.0}]
# puts [format $format PostgreSQL: $t]
2002-03-05 12:41:19 +00:00
exec sync; after $delay ;
2002-03-06 22:01:34 +00:00
set t [ time " e x e c m y s q l - f d r h < $ s q l f i l e " 1 ]
set t [ expr { [ lindex $t 0 ] / 1000000.0 } ]
puts [ format $format MySQL: $t ]
2002-03-05 01:11:12 +00:00
# set t [time "exec ./sqlite232 s232.db <$sqlfile" 1]
# set t [expr {[lindex $t 0]/1000000.0}]
# puts [format $format {SQLite 2.3.2:} $t]
# set t [time "exec ./sqlite-100 s100.db <$sqlfile" 1]
# set t [expr {[lindex $t 0]/1000000.0}]
# puts [format $format {SQLite 2.4 (cache=100):} $t]
2002-03-05 12:41:19 +00:00
exec sync; after $delay ;
2002-04-20 14:24:41 +00:00
set t [ time " e x e c . / s q l i t e 2 4 8 s 2 k . d b < $ s q l f i l e " 1 ]
2002-03-05 01:11:12 +00:00
set t [ expr { [ lindex $t 0 ] / 1000000.0 } ]
2002-05-10 14:37:30 +00:00
puts [ format $format { SQLite 2.4 .8:} $t ]
2002-03-05 12:41:19 +00:00
exec sync; after $delay ;
2002-04-20 14:24:41 +00:00
set t [ time " e x e c . / s q l i t e 2 4 8 s n s . d b < $ s q l f i l e " 1 ]
2002-03-05 01:11:12 +00:00
set t [ expr { [ lindex $t 0 ] / 1000000.0 } ]
2002-05-10 14:37:30 +00:00
puts [ format $format { SQLite 2.4 .8 ( nosync ) : } $t ]
exec sync; after $delay ;
set t [ time " e x e c . / s q l i t e 2 4 1 2 s 2 k b . d b < $ s q l f i l e " 1 ]
set t [ expr { [ lindex $t 0 ] / 1000000.0 } ]
puts [ format $format { SQLite 2.4 .12:} $t ]
exec sync; after $delay ;
set t [ time " e x e c . / s q l i t e 2 4 1 2 s n s b . d b < $ s q l f i l e " 1 ]
set t [ expr { [ lindex $t 0 ] / 1000000.0 } ]
puts [ format $format { SQLite 2.4 .12 ( nosync ) : } $t ]
2002-03-05 12:41:19 +00:00
# set t [time "exec ./sqlite-t1 st1.db <$sqlfile" 1]
# set t [expr {[lindex $t 0]/1000000.0}]
# puts [format $format {SQLite 2.4 (test):} $t]
2002-03-05 01:11:12 +00:00
puts " < / t a b l e > "
}
# Initialize the environment
#
expr srand( 1 )
catch { exec / bin/ sh - c { rm - f s* .db} }
set fd [ open clear.sql w]
puts $fd {
drop table t1;
drop table t2;
}
close $fd
catch { exec psql drh < clear.sql}
catch { exec mysql drh < clear.sql}
set fd [ open 2 kinit.sql w]
2002-03-06 22:01:34 +00:00
puts $fd {
PRAGMA default_cache_size= 2000 ;
PRAGMA default_synchronous= on;
}
2002-03-05 01:11:12 +00:00
close $fd
2002-04-20 14:24:41 +00:00
exec ./ sqlite248 s2k.db < 2 kinit.sql
2002-05-10 14:37:30 +00:00
exec ./ sqlite2412 s2kb.db < 2 kinit.sql
2002-03-05 01:11:12 +00:00
set fd [ open nosync-init.sql w]
2002-03-06 22:01:34 +00:00
puts $fd {
PRAGMA default_cache_size= 2000 ;
PRAGMA default_synchronous= off;
}
2002-03-05 01:11:12 +00:00
close $fd
2002-04-20 14:24:41 +00:00
exec ./ sqlite248 sns.db < nosync-init.sql
2002-05-10 14:37:30 +00:00
exec ./ sqlite2412 snsb.db < nosync-init.sql
2002-03-05 01:11:12 +00:00
set ones { zero one two three four five six seven eight nine
ten eleven twelve thirteen fourteen fifteen sixteen seventeen
eighteen nineteen}
set tens { { } ten twenty thirty forty fifty sixty seventy eighty ninety}
proc number_name { n } {
if { $n >= 1000 } {
set txt " [ n u m b e r _ n a m e [ e x p r { $ n / 1 0 0 0 } ] ] t h o u s a n d "
set n [ expr { $n % 1000 } ]
} else {
set txt { }
}
2002-03-05 12:41:19 +00:00
if { $n >= 100 } {
2002-03-05 01:11:12 +00:00
append txt " [ l i n d e x $ : : o n e s [ e x p r { $ n / 1 0 0 } ] ] h u n d r e d "
set n [ expr { $n % 100 } ]
}
2002-03-05 12:41:19 +00:00
if { $n >= 20 } {
2002-03-05 01:11:12 +00:00
append txt " [ l i n d e x $ : : t e n s [ e x p r { $ n / 1 0 } ] ] "
set n [ expr { $n % 10 } ]
}
if { $n > 0 } {
append txt " [ l i n d e x $ : : o n e s $ n ] "
}
set txt [ string trim $txt ]
if { $txt == " " } { set txt zero}
return $txt
}
2002-03-05 12:41:19 +00:00
set fd [ open test$cnt.sql w]
2002-03-05 01:11:12 +00:00
puts $fd " C R E A T E T A B L E t 1 ( a I N T E G E R , b I N T E G E R , c V A R C H A R ( 1 0 0 ) ) ; "
for { set i 1 } { $i <= 1000 } { incr i} {
set r [ expr { int ( rand ( ) * 100000 ) } ]
puts $fd " I N S E R T I N T O t 1 V A L U E S ( $ i , $ r , ' [ n u m b e r _ n a m e $ r ] ' ) ; "
}
close $fd
2002-03-05 12:41:19 +00:00
runtest { 1000 INSERTs}
2002-03-05 01:11:12 +00:00
2002-03-05 12:41:19 +00:00
set fd [ open test$cnt.sql w]
2002-03-05 01:11:12 +00:00
puts $fd " B E G I N ; "
puts $fd " C R E A T E T A B L E t 2 ( a I N T E G E R , b I N T E G E R , c V A R C H A R ( 1 0 0 ) ) ; "
for { set i 1 } { $i <= 25000 } { incr i} {
set r [ expr { int ( rand ( ) * 500000 ) } ]
puts $fd " I N S E R T I N T O t 2 V A L U E S ( $ i , $ r , ' [ n u m b e r _ n a m e $ r ] ' ) ; "
}
puts $fd " C O M M I T ; "
close $fd
2002-03-05 12:41:19 +00:00
runtest { 25000 INSERTs in a transaction}
2002-03-05 01:11:12 +00:00
2002-03-05 12:41:19 +00:00
set fd [ open test$cnt.sql w]
2002-03-05 01:11:12 +00:00
for { set i 0 } { $i < 100 } { incr i} {
set lwr [ expr { $i * 100 } ]
set upr [ expr { ( $i + 10 ) * 100 } ]
puts $fd " S E L E C T c o u n t ( * ) , a v g ( b ) F R O M t 2 W H E R E b > = $ l w r A N D b < $ u p r ; "
}
close $fd
2002-03-05 12:41:19 +00:00
runtest { 100 SELECTs without an index}
2002-03-05 01:11:12 +00:00
2002-03-05 12:41:19 +00:00
set fd [ open test$cnt.sql w]
for { set i 1 } { $i <= 100 } { incr i} {
puts $fd " S E L E C T c o u n t ( * ) , a v g ( b ) F R O M t 2 W H E R E c L I K E ' % [ n u m b e r _ n a m e $ i ] % ' ; "
}
close $fd
runtest { 100 SELECTs on a string comparison}
set fd [ open test$cnt.sql w]
2002-03-05 01:11:12 +00:00
puts $fd { CREATE INDEX i2a ON t2( a ) ; }
puts $fd { CREATE INDEX i2b ON t2( b ) ; }
close $fd
2002-03-05 12:41:19 +00:00
runtest { Creating an index}
2002-03-05 01:11:12 +00:00
2002-03-05 12:41:19 +00:00
set fd [ open test$cnt.sql w]
2002-03-05 01:11:12 +00:00
for { set i 0 } { $i < 5000 } { incr i} {
set lwr [ expr { $i * 100 } ]
set upr [ expr { ( $i + 1 ) * 100 } ]
puts $fd " S E L E C T c o u n t ( * ) , a v g ( b ) F R O M t 2 W H E R E b > = $ l w r A N D b < $ u p r ; "
}
close $fd
2002-03-05 12:41:19 +00:00
runtest { 5000 SELECTs with an index}
2002-03-05 01:11:12 +00:00
2002-03-05 12:41:19 +00:00
set fd [ open test$cnt.sql w]
2002-03-05 01:11:12 +00:00
puts $fd " B E G I N ; "
2002-03-06 22:01:34 +00:00
for { set i 0 } { $i < 1000 } { incr i} {
2002-03-05 01:11:12 +00:00
set lwr [ expr { $i * 10 } ]
set upr [ expr { ( $i + 1 ) * 10 } ]
puts $fd " U P D A T E t 1 S E T b = b * 2 W H E R E a > = $ l w r A N D a < $ u p r ; "
}
puts $fd " C O M M I T ; "
close $fd
2002-03-06 22:01:34 +00:00
runtest { 1000 UPDATEs without an index}
2002-03-05 12:41:19 +00:00
2002-03-05 01:11:12 +00:00
2002-03-05 12:41:19 +00:00
set fd [ open test$cnt.sql w]
2002-03-05 01:11:12 +00:00
puts $fd " B E G I N ; "
for { set i 1 } { $i <= 25000 } { incr i} {
2002-03-06 22:01:34 +00:00
set r [ expr { int ( rand ( ) * 500000 ) } ]
puts $fd " U P D A T E t 2 S E T b = $ r W H E R E a = $ i ; "
2002-03-05 01:11:12 +00:00
}
puts $fd " C O M M I T ; "
close $fd
2002-03-05 12:41:19 +00:00
runtest { 25000 UPDATEs with an index}
2002-03-05 01:11:12 +00:00
2002-03-06 22:01:34 +00:00
set fd [ open test$cnt.sql w]
puts $fd " B E G I N ; "
for { set i 1 } { $i <= 25000 } { incr i} {
set r [ expr { int ( rand ( ) * 500000 ) } ]
puts $fd " U P D A T E t 2 S E T c = ' [ n u m b e r _ n a m e $ r ] ' W H E R E a = $ i ; "
}
puts $fd " C O M M I T ; "
close $fd
runtest { 25000 text UPDATEs with an index}
2002-03-05 12:41:19 +00:00
set fd [ open test$cnt.sql w]
2002-03-05 01:11:12 +00:00
puts $fd " B E G I N ; "
puts $fd " I N S E R T I N T O t 1 S E L E C T * F R O M t 2 ; "
puts $fd " I N S E R T I N T O t 2 S E L E C T * F R O M t 1 ; "
puts $fd " C O M M I T ; "
close $fd
2002-03-05 12:41:19 +00:00
runtest { INSERTs from a SELECT}
2002-03-05 01:11:12 +00:00
2002-03-05 12:41:19 +00:00
set fd [ open test$cnt.sql w]
2002-03-05 01:11:12 +00:00
puts $fd { DELETE FROM t2 WHERE c LIKE ' % fifty% ' ; }
close $fd
2002-03-05 12:41:19 +00:00
runtest { DELETE without an index}
2002-03-05 01:11:12 +00:00
2002-03-05 12:41:19 +00:00
set fd [ open test$cnt.sql w]
2002-03-05 01:11:12 +00:00
puts $fd { DELETE FROM t2 WHERE a> 10 AND a< 20000 ; }
close $fd
2002-03-05 12:41:19 +00:00
runtest { DELETE with an index}
2002-03-05 01:11:12 +00:00
2002-03-05 12:41:19 +00:00
set fd [ open test$cnt.sql w]
2002-03-05 01:11:12 +00:00
puts $fd { INSERT INTO t2 SELECT * FROM t1; }
close $fd
2002-03-05 12:41:19 +00:00
runtest { A big INSERT after a big DELETE}
2002-03-05 01:11:12 +00:00
2002-03-05 12:41:19 +00:00
set fd [ open test$cnt.sql w]
2002-03-05 01:11:12 +00:00
puts $fd { BEGIN ; }
puts $fd { DELETE FROM t1; }
2002-03-06 22:01:34 +00:00
for { set i 1 } { $i <= 3000 } { incr i} {
2002-03-05 01:11:12 +00:00
set r [ expr { int ( rand ( ) * 100000 ) } ]
puts $fd " I N S E R T I N T O t 1 V A L U E S ( $ i , $ r , ' [ n u m b e r _ n a m e $ r ] ' ) ; "
}
puts $fd { COMMIT ; }
close $fd
2002-03-05 12:41:19 +00:00
runtest { A big DELETE followed by many small INSERTs}
2002-03-05 01:11:12 +00:00
2002-03-05 12:41:19 +00:00
set fd [ open test$cnt.sql w]
2002-03-05 01:11:12 +00:00
puts $fd { DROP TABLE t1; }
puts $fd { DROP TABLE t2; }
close $fd
2002-03-05 12:41:19 +00:00
runtest { DROP TABLE}