gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/speed2.test (about)

     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