Annotation of embedaddon/sqlite3/test/speed1p.explain, revision 1.1.1.1

1.1       misho       1: # 2008 March 21
                      2: #
                      3: # The author disclaims copyright to this source code.  In place of
                      4: # a legal notice, here is a blessing:
                      5: #
                      6: #    May you do good and not evil.
                      7: #    May you find forgiveness for yourself and forgive others.
                      8: #    May you share freely, never taking more than you give.
                      9: #
                     10: #*************************************************************************
                     11: # This file implements regression tests for SQLite library.  The
                     12: # focus of this script is measuring executing speed.  
                     13: #
                     14: # This is a copy of speed1.test modified to user prepared statements.
                     15: #
                     16: # $Id: speed1p.explain,v 1.1 2008/04/16 12:57:48 drh Exp $
                     17: #
                     18: 
                     19: set testdir [file dirname $argv0]
                     20: source $testdir/tester.tcl
                     21: speed_trial_init speed1
                     22: 
                     23: # Set a uniform random seed
                     24: expr srand(0)
                     25: 
                     26: set sqlout [open speed1.txt w]
                     27: proc tracesql {sql} {
                     28:   puts $::sqlout $sql\;
                     29: }
                     30: #db trace tracesql
                     31: 
                     32: # The number_name procedure below converts its argment (an integer)
                     33: # into a string which is the English-language name for that number.
                     34: #
                     35: # Example:
                     36: #
                     37: #     puts [number_name 123]   ->  "one hundred twenty three"
                     38: #
                     39: set ones {zero one two three four five six seven eight nine
                     40:           ten eleven twelve thirteen fourteen fifteen sixteen seventeen
                     41:           eighteen nineteen}
                     42: set tens {{} ten twenty thirty forty fifty sixty seventy eighty ninety}
                     43: proc number_name {n} {
                     44:   if {$n>=1000} {
                     45:     set txt "[number_name [expr {$n/1000}]] thousand"
                     46:     set n [expr {$n%1000}]
                     47:   } else {
                     48:     set txt {}
                     49:   }
                     50:   if {$n>=100} {
                     51:     append txt " [lindex $::ones [expr {$n/100}]] hundred"
                     52:     set n [expr {$n%100}]
                     53:   }
                     54:   if {$n>=20} {
                     55:     append txt " [lindex $::tens [expr {$n/10}]]"
                     56:     set n [expr {$n%10}]
                     57:   }
                     58:   if {$n>0} {
                     59:     append txt " [lindex $::ones $n]"
                     60:   }
                     61:   set txt [string trim $txt]
                     62:   if {$txt==""} {set txt zero}
                     63:   return $txt
                     64: }
                     65: 
                     66: # Create a database schema.
                     67: #
                     68: do_test speed1p-1.0 {
                     69:   execsql {
                     70:     PRAGMA page_size=1024;
                     71:     PRAGMA cache_size=8192;
                     72:     PRAGMA locking_mode=EXCLUSIVE;
                     73:     CREATE TABLE t1(a INTEGER, b INTEGER, c TEXT);
                     74:     CREATE TABLE t2(a INTEGER, b INTEGER, c TEXT);
                     75:     CREATE INDEX i2a ON t2(a);
                     76:     CREATE INDEX i2b ON t2(b);
                     77:   }
                     78:   execsql {
                     79:     SELECT name FROM sqlite_master ORDER BY 1;
                     80:   }
                     81: } {i2a i2b t1 t2}
                     82: 
                     83: 
                     84: # 50000 INSERTs on an unindexed table
                     85: #
                     86: set list {}
                     87: for {set i 1} {$i<=50000} {incr i} {
                     88:   set r [expr {int(rand()*500000)}]
                     89:   set x [number_name $r]
                     90:   lappend list $i $r $x
                     91: }
                     92: set script {
                     93:   foreach {i r x} $::list {
                     94:     db eval {INSERT INTO t1 VALUES($i,$r,$x)}
                     95:   }
                     96: }
                     97: explain {INSERT INTO t1 VALUES($i,$r,$x)}
                     98: db eval BEGIN
                     99: speed_trial_tcl speed1p-insert1 50000 row $script
                    100: db eval COMMIT
                    101: 
                    102: # 50000 INSERTs on an indexed table
                    103: #
                    104: set list {}
                    105: for {set i 1} {$i<=50000} {incr i} {
                    106:   set r [expr {int(rand()*500000)}]
                    107:   set x [number_name $r]
                    108:   lappend list $i $r $x
                    109: }
                    110: set script {
                    111:   foreach {i r x} $::list {
                    112:     db eval {INSERT INTO t2 VALUES($i,$r,$x)}
                    113:   }
                    114: }
                    115: explain {INSERT INTO t2 VALUES($i,$r,$x)}
                    116: db eval BEGIN
                    117: speed_trial_tcl speed1p-insert2 50000 row $script
                    118: db eval COMMIT
                    119: 
                    120: 
                    121: 
                    122: # 50 SELECTs on an integer comparison.  There is no index so
                    123: # a full table scan is required.
                    124: #
                    125: set list {}
                    126: for {set i 0} {$i<50} {incr i} {
                    127:   set lwr [expr {$i*100}]
                    128:   set upr [expr {($i+10)*100}]
                    129:   lappend list $lwr $upr
                    130: }
                    131: set script {
                    132:   foreach {lwr upr} $::list {
                    133:     db eval  {SELECT count(*), avg(b) FROM t1 WHERE b>=$lwr AND b<$upr}
                    134:   }
                    135: }
                    136: explain {SELECT count(*), avg(b) FROM t1 WHERE b>=$lwr AND b<$upr}
                    137: db eval BEGIN
                    138: speed_trial_tcl speed1p-select1 [expr {50*50000}] row $script
                    139: db eval COMMIT
                    140: 
                    141: # 50 SELECTs on an LIKE comparison.  There is no index so a full
                    142: # table scan is required.
                    143: #
                    144: set list {}
                    145: for {set i 0} {$i<50} {incr i} {
                    146:   lappend list "%[number_name $i]%"
                    147: }
                    148: set script {
                    149:   foreach pattern $::list {
                    150:     db eval {SELECT count(*), avg(b) FROM t1 WHERE c LIKE $pattern}
                    151:   }
                    152: }
                    153: explain {SELECT count(*), avg(b) FROM t1 WHERE c LIKE $pattern}
                    154: db eval BEGIN
                    155: speed_trial_tcl speed1p-select2 [expr {50*50000}] row $script
                    156: db eval COMMIT
                    157: 
                    158: # Create indices
                    159: #
                    160: explain {CREATE INDEX i1a ON t1(a)}
                    161: explain {CREATE INDEX i1b ON t1(b)}
                    162: db eval BEGIN
                    163: speed_trial speed1p-createidx 150000 row {
                    164:   CREATE INDEX i1a ON t1(a);
                    165:   CREATE INDEX i1b ON t1(b);
                    166:   CREATE INDEX i1c ON t1(c);
                    167: }
                    168: db eval COMMIT
                    169: 
                    170: # 5000 SELECTs on an integer comparison where the integer is
                    171: # indexed.
                    172: #
                    173: set list {}
                    174: for {set i 0} {$i<5000} {incr i} {
                    175:   set lwr [expr {$i*100}]
                    176:   set upr [expr {($i+10)*100}]
                    177:   lappend list $lwr $upr
                    178: }
                    179: set script {
                    180:   foreach {lwr upr} $::list {
                    181:     db eval {SELECT count(*), avg(b) FROM t1 WHERE b>=$lwr AND b<$upr}
                    182:   }
                    183: }
                    184: explain {SELECT count(*), avg(b) FROM t1 WHERE b>=$lwr AND b<$upr}
                    185: db eval BEGIN
                    186: speed_trial_tcl speed1p-select3 5000 stmt $script
                    187: db eval COMMIT
                    188: 
                    189: # 100000 random SELECTs against rowid.
                    190: #
                    191: set list {}
                    192: for {set i 1} {$i<=100000} {incr i} {
                    193:   set id [expr {int(rand()*50000)+1}]
                    194:   lappend list $id
                    195: }
                    196: set script {
                    197:   foreach id $::list {
                    198:     db eval {SELECT c FROM t1 WHERE rowid=$id}
                    199:   }
                    200: }
                    201: explain {SELECT c FROM t1 WHERE rowid=$id}
                    202: db eval BEGIN
                    203: speed_trial_tcl speed1p-select4 100000 row $script
                    204: db eval COMMIT
                    205: 
                    206: # 100000 random SELECTs against a unique indexed column.
                    207: #
                    208: set list {}
                    209: for {set i 1} {$i<=100000} {incr i} {
                    210:   set id [expr {int(rand()*50000)+1}]
                    211:   lappend list $id
                    212: }
                    213: set script {
                    214:   foreach id $::list {
                    215:     db eval {SELECT c FROM t1 WHERE a=$id}
                    216:   }
                    217: }
                    218: explain {SELECT c FROM t1 WHERE a=$id}
                    219: db eval BEGIN
                    220: speed_trial_tcl speed1p-select5 100000 row $script
                    221: db eval COMMIT
                    222: 
                    223: # 50000 random SELECTs against an indexed column text column
                    224: #
                    225: set list [db eval {SELECT c FROM t1 ORDER BY random() LIMIT 50000}]
                    226: set script {
                    227:   foreach c $::list {
                    228:     db eval {SELECT c FROM t1 WHERE c=$c}
                    229:   }
                    230: }
                    231: explain {SELECT c FROM t1 WHERE c=$c}
                    232: db eval BEGIN
                    233: speed_trial_tcl speed1p-select6 50000 row $script
                    234: db eval COMMIT
                    235: 
                    236: 
                    237: # Vacuum
                    238: speed_trial speed1p-vacuum 100000 row VACUUM
                    239: 
                    240: # 5000 updates of ranges where the field being compared is indexed.
                    241: #
                    242: set list {}
                    243: for {set i 0} {$i<5000} {incr i} {
                    244:   set lwr [expr {$i*2}]
                    245:   set upr [expr {($i+1)*2}]
                    246:   lappend list $lwr $upr
                    247: }
                    248: set script {
                    249:   foreach {lwr upr} $::list {
                    250:     db eval {UPDATE t1 SET b=b*2 WHERE a>=$lwr AND a<$upr}
                    251:   }
                    252: }
                    253: explain {UPDATE t1 SET b=b*2 WHERE a>=$lwr AND a<$upr}
                    254: db eval BEGIN
                    255: speed_trial_tcl speed1p-update1 5000 stmt $script
                    256: db eval COMMIT
                    257: 
                    258: # 50000 single-row updates.  An index is used to find the row quickly.
                    259: #
                    260: set list {}
                    261: for {set i 0} {$i<50000} {incr i} {
                    262:   set r [expr {int(rand()*500000)}]
                    263:   lappend list $i $r
                    264: }
                    265: set script {
                    266:   foreach {i r} $::list {
                    267:     db eval {UPDATE t1 SET b=$r WHERE a=$i}
                    268:   }
                    269: }
                    270: explain {UPDATE t1 SET b=$r WHERE a=$i}
                    271: db eval BEGIN
                    272: speed_trial_tcl speed1p-update2 50000 row $script
                    273: db eval COMMIT
                    274: 
                    275: # 1 big text update that touches every row in the table.
                    276: #
                    277: explain {UPDATE t1 SET c=a}
                    278: speed_trial speed1p-update3 50000 row {
                    279:   UPDATE t1 SET c=a;
                    280: }
                    281: 
                    282: # Many individual text updates.  Each row in the table is
                    283: # touched through an index.
                    284: #
                    285: set list {}
                    286: for {set i 1} {$i<=50000} {incr i} {
                    287:   set r [expr {int(rand()*500000)}]
                    288:   lappend list $i [number_name $r]
                    289: }
                    290: set script {
                    291:   foreach {i x} $::list {
                    292:     db eval {UPDATE t1 SET c=$x WHERE a=$i}
                    293:   }
                    294: }
                    295: explain {UPDATE t1 SET c=$x WHERE a=$i}
                    296: db eval BEGIN
                    297: speed_trial_tcl speed1p-update4 50000 row $script
                    298: db eval COMMIT
                    299: 
                    300: # Delete all content in a table.
                    301: #
                    302: explain {DELETE FROM t1}
                    303: speed_trial speed1p-delete1 50000 row {DELETE FROM t1}
                    304: 
                    305: # Copy one table into another
                    306: #
                    307: explain {INSERT INTO t1 SELECT * FROM t2}
                    308: speed_trial speed1p-copy1 50000 row {INSERT INTO t1 SELECT * FROM t2}
                    309: 
                    310: # Delete all content in a table, one row at a time.
                    311: #
                    312: explain {DELETE FROM t1 WHERE 1}
                    313: speed_trial speed1p-delete2 50000 row {DELETE FROM t1 WHERE 1}
                    314: 
                    315: # Refill the table yet again
                    316: #
                    317: speed_trial speed1p-copy2 50000 row {INSERT INTO t1 SELECT * FROM t2}
                    318: 
                    319: # Drop the table and recreate it without its indices.
                    320: #
                    321: explain {DROP TABLE t1}
                    322: explain {CREATE TABLE tX(a INTEGER, b INTEGER, c TEXT)}
                    323: db eval BEGIN
                    324: speed_trial speed1p-drop1 50000 row {
                    325:    DROP TABLE t1;
                    326:    CREATE TABLE t1(a INTEGER, b INTEGER, c TEXT);
                    327: }
                    328: db eval COMMIT
                    329: 
                    330: # Refill the table yet again.  This copy should be faster because
                    331: # there are no indices to deal with.
                    332: #
                    333: speed_trial speed1p-copy3 50000 row {INSERT INTO t1 SELECT * FROM t2}
                    334: 
                    335: # Select 20000 rows from the table at random.
                    336: #
                    337: explain {SELECT rowid FROM t1 ORDER BY random() LIMIT 20000}
                    338: speed_trial speed1p-random1 50000 row {
                    339:   SELECT rowid FROM t1 ORDER BY random() LIMIT 20000
                    340: }
                    341: 
                    342: # Delete 20000 random rows from the table.
                    343: #
                    344: explain {DELETE FROM t1 WHERE rowid IN
                    345:     (SELECT rowid FROM t1 ORDER BY random() LIMIT 20000)}
                    346: speed_trial speed1p-random-del1 20000 row {
                    347:   DELETE FROM t1 WHERE rowid IN
                    348:     (SELECT rowid FROM t1 ORDER BY random() LIMIT 20000)
                    349: }
                    350: do_test speed1p-1.1 {
                    351:   db one {SELECT count(*) FROM t1}
                    352: } 30000
                    353: 
                    354:     
                    355: # Delete 20000 more rows at random from the table.
                    356: #
                    357: speed_trial speed1p-random-del2 20000 row {
                    358:   DELETE FROM t1 WHERE rowid IN
                    359:     (SELECT rowid FROM t1 ORDER BY random() LIMIT 20000)
                    360: }
                    361: do_test speed1p-1.2 {
                    362:   db one {SELECT count(*) FROM t1}
                    363: } 10000
                    364: speed_trial_summary speed1
                    365: 
                    366: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>