Annotation of embedaddon/sqlite3/test/speed2.test, revision 1.1.1.1

1.1       misho       1: # 2006 November 23
                      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: # $Id: speed2.test,v 1.7 2007/04/16 15:02:20 drh Exp $
                     15: #
                     16: 
                     17: set testdir [file dirname $argv0]
                     18: source $testdir/tester.tcl
                     19: speed_trial_init speed2
                     20: 
                     21: # Set a uniform random seed
                     22: expr srand(0)
                     23: 
                     24: set sqlout [open speed2.txt w]
                     25: proc tracesql {sql} {
                     26:   puts $::sqlout $sql\;
                     27: }
                     28: #db trace tracesql
                     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 speed2-1.0 {
                     67:   execsql {
                     68:     PRAGMA page_size=1024;
                     69:     PRAGMA cache_size=8192;
                     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 sql {}
                     85: for {set i 1} {$i<=50000} {incr i} {
                     86:   set r [expr {int(rand()*500000)}]
                     87:   append sql "INSERT INTO t1 VALUES($i,$r,'[number_name $r]');\n"
                     88: }
                     89: db eval BEGIN
                     90: speed_trial speed2-insert1 50000 row $sql
                     91: db eval COMMIT
                     92: 
                     93: # 50000 INSERTs on an indexed table
                     94: #
                     95: set sql {}
                     96: for {set i 1} {$i<=50000} {incr i} {
                     97:   set r [expr {int(rand()*500000)}]
                     98:   append sql "INSERT INTO t2 VALUES($i,$r,'[number_name $r]');\n"
                     99: }
                    100: db eval BEGIN
                    101: speed_trial speed2-insert2 50000 row $sql
                    102: db eval COMMIT
                    103: 
                    104: 
                    105: 
                    106: # 50 SELECTs on an integer comparison.  There is no index so
                    107: # a full table scan is required.
                    108: #
                    109: set sql {}
                    110: for {set i 0} {$i<50} {incr i} {
                    111:   set lwr [expr {$i*100}]
                    112:   set upr [expr {($i+10)*100}]
                    113:   append sql "SELECT count(*), avg(b) FROM t1 WHERE b>=$lwr AND b<$upr;"
                    114: }
                    115: speed_trial speed2-select1a [expr {50*50000}] row $sql
                    116: 
                    117: # 50 SELECTs on an LIKE comparison.  There is no index so a full
                    118: # table scan is required.
                    119: #
                    120: set sql {}
                    121: for {set i 0} {$i<50} {incr i} {
                    122:   append sql \
                    123:     "SELECT count(*), avg(b) FROM t1 WHERE c LIKE '%[number_name $i]%';"
                    124: }
                    125: speed_trial speed2-select2a [expr {50*50000}] row $sql
                    126: 
                    127: # Vacuum
                    128: speed_trial speed2-vacuum1 100000 row VACUUM
                    129: 
                    130: # 50 SELECTs on an integer comparison.  There is no index so
                    131: # a full table scan is required.
                    132: #
                    133: set sql {}
                    134: for {set i 0} {$i<50} {incr i} {
                    135:   set lwr [expr {$i*100}]
                    136:   set upr [expr {($i+10)*100}]
                    137:   append sql "SELECT count(*), avg(b) FROM t1 WHERE b>=$lwr AND b<$upr;"
                    138: }
                    139: speed_trial speed2-select1b [expr {50*50000}] row $sql
                    140: 
                    141: # 50 SELECTs on an LIKE comparison.  There is no index so a full
                    142: # table scan is required.
                    143: #
                    144: set sql {}
                    145: for {set i 0} {$i<50} {incr i} {
                    146:   append sql \
                    147:     "SELECT count(*), avg(b) FROM t1 WHERE c LIKE '%[number_name $i]%';"
                    148: }
                    149: speed_trial speed2-select2b [expr {50*50000}] row $sql
                    150: 
                    151: # Create indices
                    152: #
                    153: db eval BEGIN
                    154: speed_trial speed2-createidx 150000 row {
                    155:   CREATE INDEX i1a ON t1(a);
                    156:   CREATE INDEX i1b ON t1(b);
                    157:   CREATE INDEX i1c ON t1(c);
                    158: }
                    159: db eval COMMIT
                    160: 
                    161: # 5000 SELECTs on an integer comparison where the integer is
                    162: # indexed.
                    163: #
                    164: set sql {}
                    165: for {set i 0} {$i<5000} {incr i} {
                    166:   set lwr [expr {$i*100}]
                    167:   set upr [expr {($i+10)*100}]
                    168:   append sql "SELECT count(*), avg(b) FROM t1 WHERE b>=$lwr AND b<$upr;"
                    169: }
                    170: speed_trial speed2-select3a 5000 stmt $sql
                    171: 
                    172: # 100000 random SELECTs against rowid.
                    173: #
                    174: set sql {}
                    175: for {set i 1} {$i<=100000} {incr i} {
                    176:   set id [expr {int(rand()*50000)+1}]
                    177:   append sql "SELECT c=='hi' FROM t1 WHERE rowid=$id;\n"
                    178: }
                    179: speed_trial speed2-select4a 100000 row $sql
                    180: 
                    181: # 100000 random SELECTs against a unique indexed column.
                    182: #
                    183: set sql {}
                    184: for {set i 1} {$i<=100000} {incr i} {
                    185:   set id [expr {int(rand()*50000)+1}]
                    186:   append sql "SELECT c FROM t1 WHERE a=$id;"
                    187: }
                    188: speed_trial speed2-select5a 100000 row $sql
                    189: 
                    190: # 50000 random SELECTs against an indexed column text column
                    191: #
                    192: set sql {}
                    193: db eval {SELECT c FROM t1 ORDER BY random() LIMIT 50000} {
                    194:   append sql "SELECT c FROM t1 WHERE c='$c';"
                    195: }
                    196: speed_trial speed2-select6a 50000 row $sql
                    197: 
                    198: # Vacuum
                    199: speed_trial speed2-vacuum2 100000 row VACUUM
                    200: 
                    201: 
                    202: # 5000 SELECTs on an integer comparison where the integer is
                    203: # indexed.
                    204: #
                    205: set sql {}
                    206: for {set i 0} {$i<5000} {incr i} {
                    207:   set lwr [expr {$i*100}]
                    208:   set upr [expr {($i+10)*100}]
                    209:   append sql "SELECT count(*), avg(b) FROM t1 WHERE b>=$lwr AND b<$upr;"
                    210: }
                    211: speed_trial speed2-select3b 5000 stmt $sql
                    212: 
                    213: # 100000 random SELECTs against rowid.
                    214: #
                    215: set sql {}
                    216: for {set i 1} {$i<=100000} {incr i} {
                    217:   set id [expr {int(rand()*50000)+1}]
                    218:   append sql "SELECT c=='hi' FROM t1 WHERE rowid=$id;\n"
                    219: }
                    220: speed_trial speed2-select4b 100000 row $sql
                    221: 
                    222: # 100000 random SELECTs against a unique indexed column.
                    223: #
                    224: set sql {}
                    225: for {set i 1} {$i<=100000} {incr i} {
                    226:   set id [expr {int(rand()*50000)+1}]
                    227:   append sql "SELECT c FROM t1 WHERE a=$id;"
                    228: }
                    229: speed_trial speed2-select5b 100000 row $sql
                    230: 
                    231: # 50000 random SELECTs against an indexed column text column
                    232: #
                    233: set sql {}
                    234: db eval {SELECT c FROM t1 ORDER BY random() LIMIT 50000} {
                    235:   append sql "SELECT c FROM t1 WHERE c='$c';"
                    236: }
                    237: speed_trial speed2-select6b 50000 row $sql
                    238: 
                    239: # 5000 updates of ranges where the field being compared is indexed.
                    240: #
                    241: set sql {}
                    242: for {set i 0} {$i<5000} {incr i} {
                    243:   set lwr [expr {$i*2}]
                    244:   set upr [expr {($i+1)*2}]
                    245:   append sql "UPDATE t1 SET b=b*2 WHERE a>=$lwr AND a<$upr;"
                    246: }
                    247: db eval BEGIN
                    248: speed_trial speed2-update1 5000 stmt $sql
                    249: db eval COMMIT
                    250: 
                    251: # 50000 single-row updates.  An index is used to find the row quickly.
                    252: #
                    253: set sql {}
                    254: for {set i 0} {$i<50000} {incr i} {
                    255:   set r [expr {int(rand()*500000)}]
                    256:   append sql "UPDATE t1 SET b=$r WHERE a=$i;"
                    257: }
                    258: db eval BEGIN
                    259: speed_trial speed2-update2 50000 row $sql
                    260: db eval COMMIT
                    261: 
                    262: # 1 big text update that touches every row in the table.
                    263: #
                    264: speed_trial speed2-update3 50000 row {
                    265:   UPDATE t1 SET c=a;
                    266: }
                    267: 
                    268: # Many individual text updates.  Each row in the table is
                    269: # touched through an index.
                    270: #
                    271: set sql {}
                    272: for {set i 1} {$i<=50000} {incr i} {
                    273:   set r [expr {int(rand()*500000)}]
                    274:   append sql "UPDATE t1 SET c='[number_name $r]' WHERE a=$i;"
                    275: }
                    276: db eval BEGIN
                    277: speed_trial speed2-update4 50000 row $sql
                    278: db eval COMMIT
                    279: 
                    280: # Delete all content in a table.
                    281: #
                    282: speed_trial speed2-delete1 50000 row {DELETE FROM t1}
                    283: 
                    284: # Copy one table into another
                    285: #
                    286: speed_trial speed2-copy1 50000 row {INSERT INTO t1 SELECT * FROM t2}
                    287: 
                    288: # Delete all content in a table, one row at a time.
                    289: #
                    290: speed_trial speed2-delete2 50000 row {DELETE FROM t1 WHERE 1}
                    291: 
                    292: # Refill the table yet again
                    293: #
                    294: speed_trial speed2-copy2 50000 row {INSERT INTO t1 SELECT * FROM t2}
                    295: 
                    296: # Drop the table and recreate it without its indices.
                    297: #
                    298: db eval BEGIN
                    299: speed_trial speed2-drop1 50000 row {
                    300:    DROP TABLE t1;
                    301:    CREATE TABLE t1(a INTEGER, b INTEGER, c TEXT);
                    302: }
                    303: db eval COMMIT
                    304: 
                    305: # Refill the table yet again.  This copy should be faster because
                    306: # there are no indices to deal with.
                    307: #
                    308: speed_trial speed2-copy3 50000 row {INSERT INTO t1 SELECT * FROM t2}
                    309: 
                    310: # Select 20000 rows from the table at random.
                    311: #
                    312: speed_trial speed2-random1 50000 row {
                    313:   SELECT rowid FROM t1 ORDER BY random() LIMIT 20000
                    314: }
                    315: 
                    316: # Delete 20000 random rows from the table.
                    317: #
                    318: speed_trial speed2-random-del1 20000 row {
                    319:   DELETE FROM t1 WHERE rowid IN
                    320:     (SELECT rowid FROM t1 ORDER BY random() LIMIT 20000)
                    321: }
                    322: do_test speed2-1.1 {
                    323:   db one {SELECT count(*) FROM t1}
                    324: } 30000
                    325: 
                    326:     
                    327: # Delete 20000 more rows at random from the table.
                    328: #
                    329: speed_trial speed2-random-del2 20000 row {
                    330:   DELETE FROM t1 WHERE rowid IN
                    331:     (SELECT rowid FROM t1 ORDER BY random() LIMIT 20000)
                    332: }
                    333: do_test speed2-1.2 {
                    334:   db one {SELECT count(*) FROM t1}
                    335: } 10000
                    336: speed_trial_summary speed2
                    337: 
                    338: 
                    339: finish_test

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