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

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