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

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