/ Hex Artifact Content
Login

Artifact d841e650a04728b39e6740296b852dccdca9b2cb:


0000: 23 20 32 30 30 38 20 4d 61 72 63 68 20 32 31 0a  # 2008 March 21.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
0050: 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e  e of.# a legal n
0060: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0070: 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20   blessing:.#.#  
0080: 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f    May you do goo
0090: 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a  d and not evil..
00a0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  #    May you fin
00b0: 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
00c0: 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
00d0: 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23  orgive others..#
00e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
00f0: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
0100: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
0110: 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a   you give..#.#**
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66  *******.# This f
0170: 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72  ile implements r
0180: 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20  egression tests 
0190: 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61  for SQLite libra
01a0: 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63 75 73  ry.  The.# focus
01b0: 20 6f 66 20 74 68 69 73 20 73 63 72 69 70 74 20   of this script 
01c0: 69 73 20 6d 65 61 73 75 72 69 6e 67 20 65 78 65  is measuring exe
01d0: 63 75 74 69 6e 67 20 73 70 65 65 64 2e 20 20 0a  cuting speed.  .
01e0: 23 0a 23 20 54 68 69 73 20 69 73 20 61 20 63 6f  #.# This is a co
01f0: 70 79 20 6f 66 20 73 70 65 65 64 31 2e 74 65 73  py of speed1.tes
0200: 74 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 75 73  t modified to us
0210: 65 72 20 70 72 65 70 61 72 65 64 20 73 74 61 74  er prepared stat
0220: 65 6d 65 6e 74 73 2e 0a 23 0a 23 20 24 49 64 3a  ements..#.# $Id:
0230: 20 73 70 65 65 64 31 70 2e 65 78 70 6c 61 69 6e   speed1p.explain
0240: 2c 76 20 31 2e 31 20 32 30 30 38 2f 30 34 2f 31  ,v 1.1 2008/04/1
0250: 36 20 31 32 3a 35 37 3a 34 38 20 64 72 68 20 45  6 12:57:48 drh E
0260: 78 70 20 24 0a 23 0a 0a 73 65 74 20 74 65 73 74  xp $.#..set test
0270: 64 69 72 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  dir [file dirnam
0280: 65 20 24 61 72 67 76 30 5d 0a 73 6f 75 72 63 65  e $argv0].source
0290: 20 24 74 65 73 74 64 69 72 2f 74 65 73 74 65 72   $testdir/tester
02a0: 2e 74 63 6c 0a 73 70 65 65 64 5f 74 72 69 61 6c  .tcl.speed_trial
02b0: 5f 69 6e 69 74 20 73 70 65 65 64 31 0a 0a 23 20  _init speed1..# 
02c0: 53 65 74 20 61 20 75 6e 69 66 6f 72 6d 20 72 61  Set a uniform ra
02d0: 6e 64 6f 6d 20 73 65 65 64 0a 65 78 70 72 20 73  ndom seed.expr s
02e0: 72 61 6e 64 28 30 29 0a 0a 73 65 74 20 73 71 6c  rand(0)..set sql
02f0: 6f 75 74 20 5b 6f 70 65 6e 20 73 70 65 65 64 31  out [open speed1
0300: 2e 74 78 74 20 77 5d 0a 70 72 6f 63 20 74 72 61  .txt w].proc tra
0310: 63 65 73 71 6c 20 7b 73 71 6c 7d 20 7b 0a 20 20  cesql {sql} {.  
0320: 70 75 74 73 20 24 3a 3a 73 71 6c 6f 75 74 20 24  puts $::sqlout $
0330: 73 71 6c 5c 3b 0a 7d 0a 23 64 62 20 74 72 61 63  sql\;.}.#db trac
0340: 65 20 74 72 61 63 65 73 71 6c 0a 0a 23 20 54 68  e tracesql..# Th
0350: 65 20 6e 75 6d 62 65 72 5f 6e 61 6d 65 20 70 72  e number_name pr
0360: 6f 63 65 64 75 72 65 20 62 65 6c 6f 77 20 63 6f  ocedure below co
0370: 6e 76 65 72 74 73 20 69 74 73 20 61 72 67 6d 65  nverts its argme
0380: 6e 74 20 28 61 6e 20 69 6e 74 65 67 65 72 29 0a  nt (an integer).
0390: 23 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20  # into a string 
03a0: 77 68 69 63 68 20 69 73 20 74 68 65 20 45 6e 67  which is the Eng
03b0: 6c 69 73 68 2d 6c 61 6e 67 75 61 67 65 20 6e 61  lish-language na
03c0: 6d 65 20 66 6f 72 20 74 68 61 74 20 6e 75 6d 62  me for that numb
03d0: 65 72 2e 0a 23 0a 23 20 45 78 61 6d 70 6c 65 3a  er..#.# Example:
03e0: 0a 23 0a 23 20 20 20 20 20 70 75 74 73 20 5b 6e  .#.#     puts [n
03f0: 75 6d 62 65 72 5f 6e 61 6d 65 20 31 32 33 5d 20  umber_name 123] 
0400: 20 20 2d 3e 20 20 22 6f 6e 65 20 68 75 6e 64 72    ->  "one hundr
0410: 65 64 20 74 77 65 6e 74 79 20 74 68 72 65 65 22  ed twenty three"
0420: 0a 23 0a 73 65 74 20 6f 6e 65 73 20 7b 7a 65 72  .#.set ones {zer
0430: 6f 20 6f 6e 65 20 74 77 6f 20 74 68 72 65 65 20  o one two three 
0440: 66 6f 75 72 20 66 69 76 65 20 73 69 78 20 73 65  four five six se
0450: 76 65 6e 20 65 69 67 68 74 20 6e 69 6e 65 0a 20  ven eight nine. 
0460: 20 20 20 20 20 20 20 20 20 74 65 6e 20 65 6c 65           ten ele
0470: 76 65 6e 20 74 77 65 6c 76 65 20 74 68 69 72 74  ven twelve thirt
0480: 65 65 6e 20 66 6f 75 72 74 65 65 6e 20 66 69 66  een fourteen fif
0490: 74 65 65 6e 20 73 69 78 74 65 65 6e 20 73 65 76  teen sixteen sev
04a0: 65 6e 74 65 65 6e 0a 20 20 20 20 20 20 20 20 20  enteen.         
04b0: 20 65 69 67 68 74 65 65 6e 20 6e 69 6e 65 74 65   eighteen ninete
04c0: 65 6e 7d 0a 73 65 74 20 74 65 6e 73 20 7b 7b 7d  en}.set tens {{}
04d0: 20 74 65 6e 20 74 77 65 6e 74 79 20 74 68 69 72   ten twenty thir
04e0: 74 79 20 66 6f 72 74 79 20 66 69 66 74 79 20 73  ty forty fifty s
04f0: 69 78 74 79 20 73 65 76 65 6e 74 79 20 65 69 67  ixty seventy eig
0500: 68 74 79 20 6e 69 6e 65 74 79 7d 0a 70 72 6f 63  hty ninety}.proc
0510: 20 6e 75 6d 62 65 72 5f 6e 61 6d 65 20 7b 6e 7d   number_name {n}
0520: 20 7b 0a 20 20 69 66 20 7b 24 6e 3e 3d 31 30 30   {.  if {$n>=100
0530: 30 7d 20 7b 0a 20 20 20 20 73 65 74 20 74 78 74  0} {.    set txt
0540: 20 22 5b 6e 75 6d 62 65 72 5f 6e 61 6d 65 20 5b   "[number_name [
0550: 65 78 70 72 20 7b 24 6e 2f 31 30 30 30 7d 5d 5d  expr {$n/1000}]]
0560: 20 74 68 6f 75 73 61 6e 64 22 0a 20 20 20 20 73   thousand".    s
0570: 65 74 20 6e 20 5b 65 78 70 72 20 7b 24 6e 25 31  et n [expr {$n%1
0580: 30 30 30 7d 5d 0a 20 20 7d 20 65 6c 73 65 20 7b  000}].  } else {
0590: 0a 20 20 20 20 73 65 74 20 74 78 74 20 7b 7d 0a  .    set txt {}.
05a0: 20 20 7d 0a 20 20 69 66 20 7b 24 6e 3e 3d 31 30    }.  if {$n>=10
05b0: 30 7d 20 7b 0a 20 20 20 20 61 70 70 65 6e 64 20  0} {.    append 
05c0: 74 78 74 20 22 20 5b 6c 69 6e 64 65 78 20 24 3a  txt " [lindex $:
05d0: 3a 6f 6e 65 73 20 5b 65 78 70 72 20 7b 24 6e 2f  :ones [expr {$n/
05e0: 31 30 30 7d 5d 5d 20 68 75 6e 64 72 65 64 22 0a  100}]] hundred".
05f0: 20 20 20 20 73 65 74 20 6e 20 5b 65 78 70 72 20      set n [expr 
0600: 7b 24 6e 25 31 30 30 7d 5d 0a 20 20 7d 0a 20 20  {$n%100}].  }.  
0610: 69 66 20 7b 24 6e 3e 3d 32 30 7d 20 7b 0a 20 20  if {$n>=20} {.  
0620: 20 20 61 70 70 65 6e 64 20 74 78 74 20 22 20 5b    append txt " [
0630: 6c 69 6e 64 65 78 20 24 3a 3a 74 65 6e 73 20 5b  lindex $::tens [
0640: 65 78 70 72 20 7b 24 6e 2f 31 30 7d 5d 5d 22 0a  expr {$n/10}]]".
0650: 20 20 20 20 73 65 74 20 6e 20 5b 65 78 70 72 20      set n [expr 
0660: 7b 24 6e 25 31 30 7d 5d 0a 20 20 7d 0a 20 20 69  {$n%10}].  }.  i
0670: 66 20 7b 24 6e 3e 30 7d 20 7b 0a 20 20 20 20 61  f {$n>0} {.    a
0680: 70 70 65 6e 64 20 74 78 74 20 22 20 5b 6c 69 6e  ppend txt " [lin
0690: 64 65 78 20 24 3a 3a 6f 6e 65 73 20 24 6e 5d 22  dex $::ones $n]"
06a0: 0a 20 20 7d 0a 20 20 73 65 74 20 74 78 74 20 5b  .  }.  set txt [
06b0: 73 74 72 69 6e 67 20 74 72 69 6d 20 24 74 78 74  string trim $txt
06c0: 5d 0a 20 20 69 66 20 7b 24 74 78 74 3d 3d 22 22  ].  if {$txt==""
06d0: 7d 20 7b 73 65 74 20 74 78 74 20 7a 65 72 6f 7d  } {set txt zero}
06e0: 0a 20 20 72 65 74 75 72 6e 20 24 74 78 74 0a 7d  .  return $txt.}
06f0: 0a 0a 23 20 43 72 65 61 74 65 20 61 20 64 61 74  ..# Create a dat
0700: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 23 0a  abase schema..#.
0710: 64 6f 5f 74 65 73 74 20 73 70 65 65 64 31 70 2d  do_test speed1p-
0720: 31 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.0 {.  execsql 
0730: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67  {.    PRAGMA pag
0740: 65 5f 73 69 7a 65 3d 31 30 32 34 3b 0a 20 20 20  e_size=1024;.   
0750: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
0760: 7a 65 3d 38 31 39 32 3b 0a 20 20 20 20 50 52 41  ze=8192;.    PRA
0770: 47 4d 41 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  GMA locking_mode
0780: 3d 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  =EXCLUSIVE;.    
0790: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
07a0: 61 20 49 4e 54 45 47 45 52 2c 20 62 20 49 4e 54  a INTEGER, b INT
07b0: 45 47 45 52 2c 20 63 20 54 45 58 54 29 3b 0a 20  EGER, c TEXT);. 
07c0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
07d0: 74 32 28 61 20 49 4e 54 45 47 45 52 2c 20 62 20  t2(a INTEGER, b 
07e0: 49 4e 54 45 47 45 52 2c 20 63 20 54 45 58 54 29  INTEGER, c TEXT)
07f0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  ;.    CREATE IND
0800: 45 58 20 69 32 61 20 4f 4e 20 74 32 28 61 29 3b  EX i2a ON t2(a);
0810: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
0820: 58 20 69 32 62 20 4f 4e 20 74 32 28 62 29 3b 0a  X i2b ON t2(b);.
0830: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a    }.  execsql {.
0840: 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 20      SELECT name 
0850: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
0860: 65 72 20 4f 52 44 45 52 20 42 59 20 31 3b 0a 20  er ORDER BY 1;. 
0870: 20 7d 0a 7d 20 7b 69 32 61 20 69 32 62 20 74 31   }.} {i2a i2b t1
0880: 20 74 32 7d 0a 0a 0a 23 20 35 30 30 30 30 20 49   t2}...# 50000 I
0890: 4e 53 45 52 54 73 20 6f 6e 20 61 6e 20 75 6e 69  NSERTs on an uni
08a0: 6e 64 65 78 65 64 20 74 61 62 6c 65 0a 23 0a 73  ndexed table.#.s
08b0: 65 74 20 6c 69 73 74 20 7b 7d 0a 66 6f 72 20 7b  et list {}.for {
08c0: 73 65 74 20 69 20 31 7d 20 7b 24 69 3c 3d 35 30  set i 1} {$i<=50
08d0: 30 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  000} {incr i} {.
08e0: 20 20 73 65 74 20 72 20 5b 65 78 70 72 20 7b 69    set r [expr {i
08f0: 6e 74 28 72 61 6e 64 28 29 2a 35 30 30 30 30 30  nt(rand()*500000
0900: 29 7d 5d 0a 20 20 73 65 74 20 78 20 5b 6e 75 6d  )}].  set x [num
0910: 62 65 72 5f 6e 61 6d 65 20 24 72 5d 0a 20 20 6c  ber_name $r].  l
0920: 61 70 70 65 6e 64 20 6c 69 73 74 20 24 69 20 24  append list $i $
0930: 72 20 24 78 0a 7d 0a 73 65 74 20 73 63 72 69 70  r $x.}.set scrip
0940: 74 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 7b 69  t {.  foreach {i
0950: 20 72 20 78 7d 20 24 3a 3a 6c 69 73 74 20 7b 0a   r x} $::list {.
0960: 20 20 20 20 64 62 20 65 76 61 6c 20 7b 49 4e 53      db eval {INS
0970: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0980: 45 53 28 24 69 2c 24 72 2c 24 78 29 7d 0a 20 20  ES($i,$r,$x)}.  
0990: 7d 0a 7d 0a 65 78 70 6c 61 69 6e 20 7b 49 4e 53  }.}.explain {INS
09a0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
09b0: 45 53 28 24 69 2c 24 72 2c 24 78 29 7d 0a 64 62  ES($i,$r,$x)}.db
09c0: 20 65 76 61 6c 20 42 45 47 49 4e 0a 73 70 65 65   eval BEGIN.spee
09d0: 64 5f 74 72 69 61 6c 5f 74 63 6c 20 73 70 65 65  d_trial_tcl spee
09e0: 64 31 70 2d 69 6e 73 65 72 74 31 20 35 30 30 30  d1p-insert1 5000
09f0: 30 20 72 6f 77 20 24 73 63 72 69 70 74 0a 64 62  0 row $script.db
0a00: 20 65 76 61 6c 20 43 4f 4d 4d 49 54 0a 0a 23 20   eval COMMIT..# 
0a10: 35 30 30 30 30 20 49 4e 53 45 52 54 73 20 6f 6e  50000 INSERTs on
0a20: 20 61 6e 20 69 6e 64 65 78 65 64 20 74 61 62 6c   an indexed tabl
0a30: 65 0a 23 0a 73 65 74 20 6c 69 73 74 20 7b 7d 0a  e.#.set list {}.
0a40: 66 6f 72 20 7b 73 65 74 20 69 20 31 7d 20 7b 24  for {set i 1} {$
0a50: 69 3c 3d 35 30 30 30 30 7d 20 7b 69 6e 63 72 20  i<=50000} {incr 
0a60: 69 7d 20 7b 0a 20 20 73 65 74 20 72 20 5b 65 78  i} {.  set r [ex
0a70: 70 72 20 7b 69 6e 74 28 72 61 6e 64 28 29 2a 35  pr {int(rand()*5
0a80: 30 30 30 30 30 29 7d 5d 0a 20 20 73 65 74 20 78  00000)}].  set x
0a90: 20 5b 6e 75 6d 62 65 72 5f 6e 61 6d 65 20 24 72   [number_name $r
0aa0: 5d 0a 20 20 6c 61 70 70 65 6e 64 20 6c 69 73 74  ].  lappend list
0ab0: 20 24 69 20 24 72 20 24 78 0a 7d 0a 73 65 74 20   $i $r $x.}.set 
0ac0: 73 63 72 69 70 74 20 7b 0a 20 20 66 6f 72 65 61  script {.  forea
0ad0: 63 68 20 7b 69 20 72 20 78 7d 20 24 3a 3a 6c 69  ch {i r x} $::li
0ae0: 73 74 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c  st {.    db eval
0af0: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32   {INSERT INTO t2
0b00: 20 56 41 4c 55 45 53 28 24 69 2c 24 72 2c 24 78   VALUES($i,$r,$x
0b10: 29 7d 0a 20 20 7d 0a 7d 0a 65 78 70 6c 61 69 6e  )}.  }.}.explain
0b20: 20 7b 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32   {INSERT INTO t2
0b30: 20 56 41 4c 55 45 53 28 24 69 2c 24 72 2c 24 78   VALUES($i,$r,$x
0b40: 29 7d 0a 64 62 20 65 76 61 6c 20 42 45 47 49 4e  )}.db eval BEGIN
0b50: 0a 73 70 65 65 64 5f 74 72 69 61 6c 5f 74 63 6c  .speed_trial_tcl
0b60: 20 73 70 65 65 64 31 70 2d 69 6e 73 65 72 74 32   speed1p-insert2
0b70: 20 35 30 30 30 30 20 72 6f 77 20 24 73 63 72 69   50000 row $scri
0b80: 70 74 0a 64 62 20 65 76 61 6c 20 43 4f 4d 4d 49  pt.db eval COMMI
0b90: 54 0a 0a 0a 0a 23 20 35 30 20 53 45 4c 45 43 54  T....# 50 SELECT
0ba0: 73 20 6f 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  s on an integer 
0bb0: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
0bc0: 72 65 20 69 73 20 6e 6f 20 69 6e 64 65 78 20 73  re is no index s
0bd0: 6f 0a 23 20 61 20 66 75 6c 6c 20 74 61 62 6c 65  o.# a full table
0be0: 20 73 63 61 6e 20 69 73 20 72 65 71 75 69 72 65   scan is require
0bf0: 64 2e 0a 23 0a 73 65 74 20 6c 69 73 74 20 7b 7d  d..#.set list {}
0c00: 0a 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b  .for {set i 0} {
0c10: 24 69 3c 35 30 7d 20 7b 69 6e 63 72 20 69 7d 20  $i<50} {incr i} 
0c20: 7b 0a 20 20 73 65 74 20 6c 77 72 20 5b 65 78 70  {.  set lwr [exp
0c30: 72 20 7b 24 69 2a 31 30 30 7d 5d 0a 20 20 73 65  r {$i*100}].  se
0c40: 74 20 75 70 72 20 5b 65 78 70 72 20 7b 28 24 69  t upr [expr {($i
0c50: 2b 31 30 29 2a 31 30 30 7d 5d 0a 20 20 6c 61 70  +10)*100}].  lap
0c60: 70 65 6e 64 20 6c 69 73 74 20 24 6c 77 72 20 24  pend list $lwr $
0c70: 75 70 72 0a 7d 0a 73 65 74 20 73 63 72 69 70 74  upr.}.set script
0c80: 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 7b 6c 77   {.  foreach {lw
0c90: 72 20 75 70 72 7d 20 24 3a 3a 6c 69 73 74 20 7b  r upr} $::list {
0ca0: 0a 20 20 20 20 64 62 20 65 76 61 6c 20 20 7b 53  .    db eval  {S
0cb0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20  ELECT count(*), 
0cc0: 61 76 67 28 62 29 20 46 52 4f 4d 20 74 31 20 57  avg(b) FROM t1 W
0cd0: 48 45 52 45 20 62 3e 3d 24 6c 77 72 20 41 4e 44  HERE b>=$lwr AND
0ce0: 20 62 3c 24 75 70 72 7d 0a 20 20 7d 0a 7d 0a 65   b<$upr}.  }.}.e
0cf0: 78 70 6c 61 69 6e 20 7b 53 45 4c 45 43 54 20 63  xplain {SELECT c
0d00: 6f 75 6e 74 28 2a 29 2c 20 61 76 67 28 62 29 20  ount(*), avg(b) 
0d10: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 3e  FROM t1 WHERE b>
0d20: 3d 24 6c 77 72 20 41 4e 44 20 62 3c 24 75 70 72  =$lwr AND b<$upr
0d30: 7d 0a 64 62 20 65 76 61 6c 20 42 45 47 49 4e 0a  }.db eval BEGIN.
0d40: 73 70 65 65 64 5f 74 72 69 61 6c 5f 74 63 6c 20  speed_trial_tcl 
0d50: 73 70 65 65 64 31 70 2d 73 65 6c 65 63 74 31 20  speed1p-select1 
0d60: 5b 65 78 70 72 20 7b 35 30 2a 35 30 30 30 30 7d  [expr {50*50000}
0d70: 5d 20 72 6f 77 20 24 73 63 72 69 70 74 0a 64 62  ] row $script.db
0d80: 20 65 76 61 6c 20 43 4f 4d 4d 49 54 0a 0a 23 20   eval COMMIT..# 
0d90: 35 30 20 53 45 4c 45 43 54 73 20 6f 6e 20 61 6e  50 SELECTs on an
0da0: 20 4c 49 4b 45 20 63 6f 6d 70 61 72 69 73 6f 6e   LIKE comparison
0db0: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 69  .  There is no i
0dc0: 6e 64 65 78 20 73 6f 20 61 20 66 75 6c 6c 0a 23  ndex so a full.#
0dd0: 20 74 61 62 6c 65 20 73 63 61 6e 20 69 73 20 72   table scan is r
0de0: 65 71 75 69 72 65 64 2e 0a 23 0a 73 65 74 20 6c  equired..#.set l
0df0: 69 73 74 20 7b 7d 0a 66 6f 72 20 7b 73 65 74 20  ist {}.for {set 
0e00: 69 20 30 7d 20 7b 24 69 3c 35 30 7d 20 7b 69 6e  i 0} {$i<50} {in
0e10: 63 72 20 69 7d 20 7b 0a 20 20 6c 61 70 70 65 6e  cr i} {.  lappen
0e20: 64 20 6c 69 73 74 20 22 25 5b 6e 75 6d 62 65 72  d list "%[number
0e30: 5f 6e 61 6d 65 20 24 69 5d 25 22 0a 7d 0a 73 65  _name $i]%".}.se
0e40: 74 20 73 63 72 69 70 74 20 7b 0a 20 20 66 6f 72  t script {.  for
0e50: 65 61 63 68 20 70 61 74 74 65 72 6e 20 24 3a 3a  each pattern $::
0e60: 6c 69 73 74 20 7b 0a 20 20 20 20 64 62 20 65 76  list {.    db ev
0e70: 61 6c 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74  al {SELECT count
0e80: 28 2a 29 2c 20 61 76 67 28 62 29 20 46 52 4f 4d  (*), avg(b) FROM
0e90: 20 74 31 20 57 48 45 52 45 20 63 20 4c 49 4b 45   t1 WHERE c LIKE
0ea0: 20 24 70 61 74 74 65 72 6e 7d 0a 20 20 7d 0a 7d   $pattern}.  }.}
0eb0: 0a 65 78 70 6c 61 69 6e 20 7b 53 45 4c 45 43 54  .explain {SELECT
0ec0: 20 63 6f 75 6e 74 28 2a 29 2c 20 61 76 67 28 62   count(*), avg(b
0ed0: 29 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  ) FROM t1 WHERE 
0ee0: 63 20 4c 49 4b 45 20 24 70 61 74 74 65 72 6e 7d  c LIKE $pattern}
0ef0: 0a 64 62 20 65 76 61 6c 20 42 45 47 49 4e 0a 73  .db eval BEGIN.s
0f00: 70 65 65 64 5f 74 72 69 61 6c 5f 74 63 6c 20 73  peed_trial_tcl s
0f10: 70 65 65 64 31 70 2d 73 65 6c 65 63 74 32 20 5b  peed1p-select2 [
0f20: 65 78 70 72 20 7b 35 30 2a 35 30 30 30 30 7d 5d  expr {50*50000}]
0f30: 20 72 6f 77 20 24 73 63 72 69 70 74 0a 64 62 20   row $script.db 
0f40: 65 76 61 6c 20 43 4f 4d 4d 49 54 0a 0a 23 20 43  eval COMMIT..# C
0f50: 72 65 61 74 65 20 69 6e 64 69 63 65 73 0a 23 0a  reate indices.#.
0f60: 65 78 70 6c 61 69 6e 20 7b 43 52 45 41 54 45 20  explain {CREATE 
0f70: 49 4e 44 45 58 20 69 31 61 20 4f 4e 20 74 31 28  INDEX i1a ON t1(
0f80: 61 29 7d 0a 65 78 70 6c 61 69 6e 20 7b 43 52 45  a)}.explain {CRE
0f90: 41 54 45 20 49 4e 44 45 58 20 69 31 62 20 4f 4e  ATE INDEX i1b ON
0fa0: 20 74 31 28 62 29 7d 0a 64 62 20 65 76 61 6c 20   t1(b)}.db eval 
0fb0: 42 45 47 49 4e 0a 73 70 65 65 64 5f 74 72 69 61  BEGIN.speed_tria
0fc0: 6c 20 73 70 65 65 64 31 70 2d 63 72 65 61 74 65  l speed1p-create
0fd0: 69 64 78 20 31 35 30 30 30 30 20 72 6f 77 20 7b  idx 150000 row {
0fe0: 0a 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  .  CREATE INDEX 
0ff0: 69 31 61 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20  i1a ON t1(a);.  
1000: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 62  CREATE INDEX i1b
1010: 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 43 52 45   ON t1(b);.  CRE
1020: 41 54 45 20 49 4e 44 45 58 20 69 31 63 20 4f 4e  ATE INDEX i1c ON
1030: 20 74 31 28 63 29 3b 0a 7d 0a 64 62 20 65 76 61   t1(c);.}.db eva
1040: 6c 20 43 4f 4d 4d 49 54 0a 0a 23 20 35 30 30 30  l COMMIT..# 5000
1050: 20 53 45 4c 45 43 54 73 20 6f 6e 20 61 6e 20 69   SELECTs on an i
1060: 6e 74 65 67 65 72 20 63 6f 6d 70 61 72 69 73 6f  nteger compariso
1070: 6e 20 77 68 65 72 65 20 74 68 65 20 69 6e 74 65  n where the inte
1080: 67 65 72 20 69 73 0a 23 20 69 6e 64 65 78 65 64  ger is.# indexed
1090: 2e 0a 23 0a 73 65 74 20 6c 69 73 74 20 7b 7d 0a  ..#.set list {}.
10a0: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
10b0: 69 3c 35 30 30 30 7d 20 7b 69 6e 63 72 20 69 7d  i<5000} {incr i}
10c0: 20 7b 0a 20 20 73 65 74 20 6c 77 72 20 5b 65 78   {.  set lwr [ex
10d0: 70 72 20 7b 24 69 2a 31 30 30 7d 5d 0a 20 20 73  pr {$i*100}].  s
10e0: 65 74 20 75 70 72 20 5b 65 78 70 72 20 7b 28 24  et upr [expr {($
10f0: 69 2b 31 30 29 2a 31 30 30 7d 5d 0a 20 20 6c 61  i+10)*100}].  la
1100: 70 70 65 6e 64 20 6c 69 73 74 20 24 6c 77 72 20  ppend list $lwr 
1110: 24 75 70 72 0a 7d 0a 73 65 74 20 73 63 72 69 70  $upr.}.set scrip
1120: 74 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 7b 6c  t {.  foreach {l
1130: 77 72 20 75 70 72 7d 20 24 3a 3a 6c 69 73 74 20  wr upr} $::list 
1140: 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 53  {.    db eval {S
1150: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c 20  ELECT count(*), 
1160: 61 76 67 28 62 29 20 46 52 4f 4d 20 74 31 20 57  avg(b) FROM t1 W
1170: 48 45 52 45 20 62 3e 3d 24 6c 77 72 20 41 4e 44  HERE b>=$lwr AND
1180: 20 62 3c 24 75 70 72 7d 0a 20 20 7d 0a 7d 0a 65   b<$upr}.  }.}.e
1190: 78 70 6c 61 69 6e 20 7b 53 45 4c 45 43 54 20 63  xplain {SELECT c
11a0: 6f 75 6e 74 28 2a 29 2c 20 61 76 67 28 62 29 20  ount(*), avg(b) 
11b0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 3e  FROM t1 WHERE b>
11c0: 3d 24 6c 77 72 20 41 4e 44 20 62 3c 24 75 70 72  =$lwr AND b<$upr
11d0: 7d 0a 64 62 20 65 76 61 6c 20 42 45 47 49 4e 0a  }.db eval BEGIN.
11e0: 73 70 65 65 64 5f 74 72 69 61 6c 5f 74 63 6c 20  speed_trial_tcl 
11f0: 73 70 65 65 64 31 70 2d 73 65 6c 65 63 74 33 20  speed1p-select3 
1200: 35 30 30 30 20 73 74 6d 74 20 24 73 63 72 69 70  5000 stmt $scrip
1210: 74 0a 64 62 20 65 76 61 6c 20 43 4f 4d 4d 49 54  t.db eval COMMIT
1220: 0a 0a 23 20 31 30 30 30 30 30 20 72 61 6e 64 6f  ..# 100000 rando
1230: 6d 20 53 45 4c 45 43 54 73 20 61 67 61 69 6e 73  m SELECTs agains
1240: 74 20 72 6f 77 69 64 2e 0a 23 0a 73 65 74 20 6c  t rowid..#.set l
1250: 69 73 74 20 7b 7d 0a 66 6f 72 20 7b 73 65 74 20  ist {}.for {set 
1260: 69 20 31 7d 20 7b 24 69 3c 3d 31 30 30 30 30 30  i 1} {$i<=100000
1270: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 73  } {incr i} {.  s
1280: 65 74 20 69 64 20 5b 65 78 70 72 20 7b 69 6e 74  et id [expr {int
1290: 28 72 61 6e 64 28 29 2a 35 30 30 30 30 29 2b 31  (rand()*50000)+1
12a0: 7d 5d 0a 20 20 6c 61 70 70 65 6e 64 20 6c 69 73  }].  lappend lis
12b0: 74 20 24 69 64 0a 7d 0a 73 65 74 20 73 63 72 69  t $id.}.set scri
12c0: 70 74 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 69  pt {.  foreach i
12d0: 64 20 24 3a 3a 6c 69 73 74 20 7b 0a 20 20 20 20  d $::list {.    
12e0: 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  db eval {SELECT 
12f0: 63 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  c FROM t1 WHERE 
1300: 72 6f 77 69 64 3d 24 69 64 7d 0a 20 20 7d 0a 7d  rowid=$id}.  }.}
1310: 0a 65 78 70 6c 61 69 6e 20 7b 53 45 4c 45 43 54  .explain {SELECT
1320: 20 63 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   c FROM t1 WHERE
1330: 20 72 6f 77 69 64 3d 24 69 64 7d 0a 64 62 20 65   rowid=$id}.db e
1340: 76 61 6c 20 42 45 47 49 4e 0a 73 70 65 65 64 5f  val BEGIN.speed_
1350: 74 72 69 61 6c 5f 74 63 6c 20 73 70 65 65 64 31  trial_tcl speed1
1360: 70 2d 73 65 6c 65 63 74 34 20 31 30 30 30 30 30  p-select4 100000
1370: 20 72 6f 77 20 24 73 63 72 69 70 74 0a 64 62 20   row $script.db 
1380: 65 76 61 6c 20 43 4f 4d 4d 49 54 0a 0a 23 20 31  eval COMMIT..# 1
1390: 30 30 30 30 30 20 72 61 6e 64 6f 6d 20 53 45 4c  00000 random SEL
13a0: 45 43 54 73 20 61 67 61 69 6e 73 74 20 61 20 75  ECTs against a u
13b0: 6e 69 71 75 65 20 69 6e 64 65 78 65 64 20 63 6f  nique indexed co
13c0: 6c 75 6d 6e 2e 0a 23 0a 73 65 74 20 6c 69 73 74  lumn..#.set list
13d0: 20 7b 7d 0a 66 6f 72 20 7b 73 65 74 20 69 20 31   {}.for {set i 1
13e0: 7d 20 7b 24 69 3c 3d 31 30 30 30 30 30 7d 20 7b  } {$i<=100000} {
13f0: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 73 65 74 20  incr i} {.  set 
1400: 69 64 20 5b 65 78 70 72 20 7b 69 6e 74 28 72 61  id [expr {int(ra
1410: 6e 64 28 29 2a 35 30 30 30 30 29 2b 31 7d 5d 0a  nd()*50000)+1}].
1420: 20 20 6c 61 70 70 65 6e 64 20 6c 69 73 74 20 24    lappend list $
1430: 69 64 0a 7d 0a 73 65 74 20 73 63 72 69 70 74 20  id.}.set script 
1440: 7b 0a 20 20 66 6f 72 65 61 63 68 20 69 64 20 24  {.  foreach id $
1450: 3a 3a 6c 69 73 74 20 7b 0a 20 20 20 20 64 62 20  ::list {.    db 
1460: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 63 20 46  eval {SELECT c F
1470: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 24  ROM t1 WHERE a=$
1480: 69 64 7d 0a 20 20 7d 0a 7d 0a 65 78 70 6c 61 69  id}.  }.}.explai
1490: 6e 20 7b 53 45 4c 45 43 54 20 63 20 46 52 4f 4d  n {SELECT c FROM
14a0: 20 74 31 20 57 48 45 52 45 20 61 3d 24 69 64 7d   t1 WHERE a=$id}
14b0: 0a 64 62 20 65 76 61 6c 20 42 45 47 49 4e 0a 73  .db eval BEGIN.s
14c0: 70 65 65 64 5f 74 72 69 61 6c 5f 74 63 6c 20 73  peed_trial_tcl s
14d0: 70 65 65 64 31 70 2d 73 65 6c 65 63 74 35 20 31  peed1p-select5 1
14e0: 30 30 30 30 30 20 72 6f 77 20 24 73 63 72 69 70  00000 row $scrip
14f0: 74 0a 64 62 20 65 76 61 6c 20 43 4f 4d 4d 49 54  t.db eval COMMIT
1500: 0a 0a 23 20 35 30 30 30 30 20 72 61 6e 64 6f 6d  ..# 50000 random
1510: 20 53 45 4c 45 43 54 73 20 61 67 61 69 6e 73 74   SELECTs against
1520: 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75   an indexed colu
1530: 6d 6e 20 74 65 78 74 20 63 6f 6c 75 6d 6e 0a 23  mn text column.#
1540: 0a 73 65 74 20 6c 69 73 74 20 5b 64 62 20 65 76  .set list [db ev
1550: 61 6c 20 7b 53 45 4c 45 43 54 20 63 20 46 52 4f  al {SELECT c FRO
1560: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 72 61  M t1 ORDER BY ra
1570: 6e 64 6f 6d 28 29 20 4c 49 4d 49 54 20 35 30 30  ndom() LIMIT 500
1580: 30 30 7d 5d 0a 73 65 74 20 73 63 72 69 70 74 20  00}].set script 
1590: 7b 0a 20 20 66 6f 72 65 61 63 68 20 63 20 24 3a  {.  foreach c $:
15a0: 3a 6c 69 73 74 20 7b 0a 20 20 20 20 64 62 20 65  :list {.    db e
15b0: 76 61 6c 20 7b 53 45 4c 45 43 54 20 63 20 46 52  val {SELECT c FR
15c0: 4f 4d 20 74 31 20 57 48 45 52 45 20 63 3d 24 63  OM t1 WHERE c=$c
15d0: 7d 0a 20 20 7d 0a 7d 0a 65 78 70 6c 61 69 6e 20  }.  }.}.explain 
15e0: 7b 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74  {SELECT c FROM t
15f0: 31 20 57 48 45 52 45 20 63 3d 24 63 7d 0a 64 62  1 WHERE c=$c}.db
1600: 20 65 76 61 6c 20 42 45 47 49 4e 0a 73 70 65 65   eval BEGIN.spee
1610: 64 5f 74 72 69 61 6c 5f 74 63 6c 20 73 70 65 65  d_trial_tcl spee
1620: 64 31 70 2d 73 65 6c 65 63 74 36 20 35 30 30 30  d1p-select6 5000
1630: 30 20 72 6f 77 20 24 73 63 72 69 70 74 0a 64 62  0 row $script.db
1640: 20 65 76 61 6c 20 43 4f 4d 4d 49 54 0a 0a 0a 23   eval COMMIT...#
1650: 20 56 61 63 75 75 6d 0a 73 70 65 65 64 5f 74 72   Vacuum.speed_tr
1660: 69 61 6c 20 73 70 65 65 64 31 70 2d 76 61 63 75  ial speed1p-vacu
1670: 75 6d 20 31 30 30 30 30 30 20 72 6f 77 20 56 41  um 100000 row VA
1680: 43 55 55 4d 0a 0a 23 20 35 30 30 30 20 75 70 64  CUUM..# 5000 upd
1690: 61 74 65 73 20 6f 66 20 72 61 6e 67 65 73 20 77  ates of ranges w
16a0: 68 65 72 65 20 74 68 65 20 66 69 65 6c 64 20 62  here the field b
16b0: 65 69 6e 67 20 63 6f 6d 70 61 72 65 64 20 69 73  eing compared is
16c0: 20 69 6e 64 65 78 65 64 2e 0a 23 0a 73 65 74 20   indexed..#.set 
16d0: 6c 69 73 74 20 7b 7d 0a 66 6f 72 20 7b 73 65 74  list {}.for {set
16e0: 20 69 20 30 7d 20 7b 24 69 3c 35 30 30 30 7d 20   i 0} {$i<5000} 
16f0: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 73 65 74  {incr i} {.  set
1700: 20 6c 77 72 20 5b 65 78 70 72 20 7b 24 69 2a 32   lwr [expr {$i*2
1710: 7d 5d 0a 20 20 73 65 74 20 75 70 72 20 5b 65 78  }].  set upr [ex
1720: 70 72 20 7b 28 24 69 2b 31 29 2a 32 7d 5d 0a 20  pr {($i+1)*2}]. 
1730: 20 6c 61 70 70 65 6e 64 20 6c 69 73 74 20 24 6c   lappend list $l
1740: 77 72 20 24 75 70 72 0a 7d 0a 73 65 74 20 73 63  wr $upr.}.set sc
1750: 72 69 70 74 20 7b 0a 20 20 66 6f 72 65 61 63 68  ript {.  foreach
1760: 20 7b 6c 77 72 20 75 70 72 7d 20 24 3a 3a 6c 69   {lwr upr} $::li
1770: 73 74 20 7b 0a 20 20 20 20 64 62 20 65 76 61 6c  st {.    db eval
1780: 20 7b 55 50 44 41 54 45 20 74 31 20 53 45 54 20   {UPDATE t1 SET 
1790: 62 3d 62 2a 32 20 57 48 45 52 45 20 61 3e 3d 24  b=b*2 WHERE a>=$
17a0: 6c 77 72 20 41 4e 44 20 61 3c 24 75 70 72 7d 0a  lwr AND a<$upr}.
17b0: 20 20 7d 0a 7d 0a 65 78 70 6c 61 69 6e 20 7b 55    }.}.explain {U
17c0: 50 44 41 54 45 20 74 31 20 53 45 54 20 62 3d 62  PDATE t1 SET b=b
17d0: 2a 32 20 57 48 45 52 45 20 61 3e 3d 24 6c 77 72  *2 WHERE a>=$lwr
17e0: 20 41 4e 44 20 61 3c 24 75 70 72 7d 0a 64 62 20   AND a<$upr}.db 
17f0: 65 76 61 6c 20 42 45 47 49 4e 0a 73 70 65 65 64  eval BEGIN.speed
1800: 5f 74 72 69 61 6c 5f 74 63 6c 20 73 70 65 65 64  _trial_tcl speed
1810: 31 70 2d 75 70 64 61 74 65 31 20 35 30 30 30 20  1p-update1 5000 
1820: 73 74 6d 74 20 24 73 63 72 69 70 74 0a 64 62 20  stmt $script.db 
1830: 65 76 61 6c 20 43 4f 4d 4d 49 54 0a 0a 23 20 35  eval COMMIT..# 5
1840: 30 30 30 30 20 73 69 6e 67 6c 65 2d 72 6f 77 20  0000 single-row 
1850: 75 70 64 61 74 65 73 2e 20 20 41 6e 20 69 6e 64  updates.  An ind
1860: 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 66 69  ex is used to fi
1870: 6e 64 20 74 68 65 20 72 6f 77 20 71 75 69 63 6b  nd the row quick
1880: 6c 79 2e 0a 23 0a 73 65 74 20 6c 69 73 74 20 7b  ly..#.set list {
1890: 7d 0a 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20  }.for {set i 0} 
18a0: 7b 24 69 3c 35 30 30 30 30 7d 20 7b 69 6e 63 72  {$i<50000} {incr
18b0: 20 69 7d 20 7b 0a 20 20 73 65 74 20 72 20 5b 65   i} {.  set r [e
18c0: 78 70 72 20 7b 69 6e 74 28 72 61 6e 64 28 29 2a  xpr {int(rand()*
18d0: 35 30 30 30 30 30 29 7d 5d 0a 20 20 6c 61 70 70  500000)}].  lapp
18e0: 65 6e 64 20 6c 69 73 74 20 24 69 20 24 72 0a 7d  end list $i $r.}
18f0: 0a 73 65 74 20 73 63 72 69 70 74 20 7b 0a 20 20  .set script {.  
1900: 66 6f 72 65 61 63 68 20 7b 69 20 72 7d 20 24 3a  foreach {i r} $:
1910: 3a 6c 69 73 74 20 7b 0a 20 20 20 20 64 62 20 65  :list {.    db e
1920: 76 61 6c 20 7b 55 50 44 41 54 45 20 74 31 20 53  val {UPDATE t1 S
1930: 45 54 20 62 3d 24 72 20 57 48 45 52 45 20 61 3d  ET b=$r WHERE a=
1940: 24 69 7d 0a 20 20 7d 0a 7d 0a 65 78 70 6c 61 69  $i}.  }.}.explai
1950: 6e 20 7b 55 50 44 41 54 45 20 74 31 20 53 45 54  n {UPDATE t1 SET
1960: 20 62 3d 24 72 20 57 48 45 52 45 20 61 3d 24 69   b=$r WHERE a=$i
1970: 7d 0a 64 62 20 65 76 61 6c 20 42 45 47 49 4e 0a  }.db eval BEGIN.
1980: 73 70 65 65 64 5f 74 72 69 61 6c 5f 74 63 6c 20  speed_trial_tcl 
1990: 73 70 65 65 64 31 70 2d 75 70 64 61 74 65 32 20  speed1p-update2 
19a0: 35 30 30 30 30 20 72 6f 77 20 24 73 63 72 69 70  50000 row $scrip
19b0: 74 0a 64 62 20 65 76 61 6c 20 43 4f 4d 4d 49 54  t.db eval COMMIT
19c0: 0a 0a 23 20 31 20 62 69 67 20 74 65 78 74 20 75  ..# 1 big text u
19d0: 70 64 61 74 65 20 74 68 61 74 20 74 6f 75 63 68  pdate that touch
19e0: 65 73 20 65 76 65 72 79 20 72 6f 77 20 69 6e 20  es every row in 
19f0: 74 68 65 20 74 61 62 6c 65 2e 0a 23 0a 65 78 70  the table..#.exp
1a00: 6c 61 69 6e 20 7b 55 50 44 41 54 45 20 74 31 20  lain {UPDATE t1 
1a10: 53 45 54 20 63 3d 61 7d 0a 73 70 65 65 64 5f 74  SET c=a}.speed_t
1a20: 72 69 61 6c 20 73 70 65 65 64 31 70 2d 75 70 64  rial speed1p-upd
1a30: 61 74 65 33 20 35 30 30 30 30 20 72 6f 77 20 7b  ate3 50000 row {
1a40: 0a 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54  .  UPDATE t1 SET
1a50: 20 63 3d 61 3b 0a 7d 0a 0a 23 20 4d 61 6e 79 20   c=a;.}..# Many 
1a60: 69 6e 64 69 76 69 64 75 61 6c 20 74 65 78 74 20  individual text 
1a70: 75 70 64 61 74 65 73 2e 20 20 45 61 63 68 20 72  updates.  Each r
1a80: 6f 77 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ow in the table 
1a90: 69 73 0a 23 20 74 6f 75 63 68 65 64 20 74 68 72  is.# touched thr
1aa0: 6f 75 67 68 20 61 6e 20 69 6e 64 65 78 2e 0a 23  ough an index..#
1ab0: 0a 73 65 74 20 6c 69 73 74 20 7b 7d 0a 66 6f 72  .set list {}.for
1ac0: 20 7b 73 65 74 20 69 20 31 7d 20 7b 24 69 3c 3d   {set i 1} {$i<=
1ad0: 35 30 30 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20  50000} {incr i} 
1ae0: 7b 0a 20 20 73 65 74 20 72 20 5b 65 78 70 72 20  {.  set r [expr 
1af0: 7b 69 6e 74 28 72 61 6e 64 28 29 2a 35 30 30 30  {int(rand()*5000
1b00: 30 30 29 7d 5d 0a 20 20 6c 61 70 70 65 6e 64 20  00)}].  lappend 
1b10: 6c 69 73 74 20 24 69 20 5b 6e 75 6d 62 65 72 5f  list $i [number_
1b20: 6e 61 6d 65 20 24 72 5d 0a 7d 0a 73 65 74 20 73  name $r].}.set s
1b30: 63 72 69 70 74 20 7b 0a 20 20 66 6f 72 65 61 63  cript {.  foreac
1b40: 68 20 7b 69 20 78 7d 20 24 3a 3a 6c 69 73 74 20  h {i x} $::list 
1b50: 7b 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 55  {.    db eval {U
1b60: 50 44 41 54 45 20 74 31 20 53 45 54 20 63 3d 24  PDATE t1 SET c=$
1b70: 78 20 57 48 45 52 45 20 61 3d 24 69 7d 0a 20 20  x WHERE a=$i}.  
1b80: 7d 0a 7d 0a 65 78 70 6c 61 69 6e 20 7b 55 50 44  }.}.explain {UPD
1b90: 41 54 45 20 74 31 20 53 45 54 20 63 3d 24 78 20  ATE t1 SET c=$x 
1ba0: 57 48 45 52 45 20 61 3d 24 69 7d 0a 64 62 20 65  WHERE a=$i}.db e
1bb0: 76 61 6c 20 42 45 47 49 4e 0a 73 70 65 65 64 5f  val BEGIN.speed_
1bc0: 74 72 69 61 6c 5f 74 63 6c 20 73 70 65 65 64 31  trial_tcl speed1
1bd0: 70 2d 75 70 64 61 74 65 34 20 35 30 30 30 30 20  p-update4 50000 
1be0: 72 6f 77 20 24 73 63 72 69 70 74 0a 64 62 20 65  row $script.db e
1bf0: 76 61 6c 20 43 4f 4d 4d 49 54 0a 0a 23 20 44 65  val COMMIT..# De
1c00: 6c 65 74 65 20 61 6c 6c 20 63 6f 6e 74 65 6e 74  lete all content
1c10: 20 69 6e 20 61 20 74 61 62 6c 65 2e 0a 23 0a 65   in a table..#.e
1c20: 78 70 6c 61 69 6e 20 7b 44 45 4c 45 54 45 20 46  xplain {DELETE F
1c30: 52 4f 4d 20 74 31 7d 0a 73 70 65 65 64 5f 74 72  ROM t1}.speed_tr
1c40: 69 61 6c 20 73 70 65 65 64 31 70 2d 64 65 6c 65  ial speed1p-dele
1c50: 74 65 31 20 35 30 30 30 30 20 72 6f 77 20 7b 44  te1 50000 row {D
1c60: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 7d 0a 0a  ELETE FROM t1}..
1c70: 23 20 43 6f 70 79 20 6f 6e 65 20 74 61 62 6c 65  # Copy one table
1c80: 20 69 6e 74 6f 20 61 6e 6f 74 68 65 72 0a 23 0a   into another.#.
1c90: 65 78 70 6c 61 69 6e 20 7b 49 4e 53 45 52 54 20  explain {INSERT 
1ca0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a  INTO t1 SELECT *
1cb0: 20 46 52 4f 4d 20 74 32 7d 0a 73 70 65 65 64 5f   FROM t2}.speed_
1cc0: 74 72 69 61 6c 20 73 70 65 65 64 31 70 2d 63 6f  trial speed1p-co
1cd0: 70 79 31 20 35 30 30 30 30 20 72 6f 77 20 7b 49  py1 50000 row {I
1ce0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
1cf0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 7d 0a  LECT * FROM t2}.
1d00: 0a 23 20 44 65 6c 65 74 65 20 61 6c 6c 20 63 6f  .# Delete all co
1d10: 6e 74 65 6e 74 20 69 6e 20 61 20 74 61 62 6c 65  ntent in a table
1d20: 2c 20 6f 6e 65 20 72 6f 77 20 61 74 20 61 20 74  , one row at a t
1d30: 69 6d 65 2e 0a 23 0a 65 78 70 6c 61 69 6e 20 7b  ime..#.explain {
1d40: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
1d50: 48 45 52 45 20 31 7d 0a 73 70 65 65 64 5f 74 72  HERE 1}.speed_tr
1d60: 69 61 6c 20 73 70 65 65 64 31 70 2d 64 65 6c 65  ial speed1p-dele
1d70: 74 65 32 20 35 30 30 30 30 20 72 6f 77 20 7b 44  te2 50000 row {D
1d80: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48  ELETE FROM t1 WH
1d90: 45 52 45 20 31 7d 0a 0a 23 20 52 65 66 69 6c 6c  ERE 1}..# Refill
1da0: 20 74 68 65 20 74 61 62 6c 65 20 79 65 74 20 61   the table yet a
1db0: 67 61 69 6e 0a 23 0a 73 70 65 65 64 5f 74 72 69  gain.#.speed_tri
1dc0: 61 6c 20 73 70 65 65 64 31 70 2d 63 6f 70 79 32  al speed1p-copy2
1dd0: 20 35 30 30 30 30 20 72 6f 77 20 7b 49 4e 53 45   50000 row {INSE
1de0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
1df0: 54 20 2a 20 46 52 4f 4d 20 74 32 7d 0a 0a 23 20  T * FROM t2}..# 
1e00: 44 72 6f 70 20 74 68 65 20 74 61 62 6c 65 20 61  Drop the table a
1e10: 6e 64 20 72 65 63 72 65 61 74 65 20 69 74 20 77  nd recreate it w
1e20: 69 74 68 6f 75 74 20 69 74 73 20 69 6e 64 69 63  ithout its indic
1e30: 65 73 2e 0a 23 0a 65 78 70 6c 61 69 6e 20 7b 44  es..#.explain {D
1e40: 52 4f 50 20 54 41 42 4c 45 20 74 31 7d 0a 65 78  ROP TABLE t1}.ex
1e50: 70 6c 61 69 6e 20 7b 43 52 45 41 54 45 20 54 41  plain {CREATE TA
1e60: 42 4c 45 20 74 58 28 61 20 49 4e 54 45 47 45 52  BLE tX(a INTEGER
1e70: 2c 20 62 20 49 4e 54 45 47 45 52 2c 20 63 20 54  , b INTEGER, c T
1e80: 45 58 54 29 7d 0a 64 62 20 65 76 61 6c 20 42 45  EXT)}.db eval BE
1e90: 47 49 4e 0a 73 70 65 65 64 5f 74 72 69 61 6c 20  GIN.speed_trial 
1ea0: 73 70 65 65 64 31 70 2d 64 72 6f 70 31 20 35 30  speed1p-drop1 50
1eb0: 30 30 30 20 72 6f 77 20 7b 0a 20 20 20 44 52 4f  000 row {.   DRO
1ec0: 50 20 54 41 42 4c 45 20 74 31 3b 0a 20 20 20 43  P TABLE t1;.   C
1ed0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
1ee0: 20 49 4e 54 45 47 45 52 2c 20 62 20 49 4e 54 45   INTEGER, b INTE
1ef0: 47 45 52 2c 20 63 20 54 45 58 54 29 3b 0a 7d 0a  GER, c TEXT);.}.
1f00: 64 62 20 65 76 61 6c 20 43 4f 4d 4d 49 54 0a 0a  db eval COMMIT..
1f10: 23 20 52 65 66 69 6c 6c 20 74 68 65 20 74 61 62  # Refill the tab
1f20: 6c 65 20 79 65 74 20 61 67 61 69 6e 2e 20 20 54  le yet again.  T
1f30: 68 69 73 20 63 6f 70 79 20 73 68 6f 75 6c 64 20  his copy should 
1f40: 62 65 20 66 61 73 74 65 72 20 62 65 63 61 75 73  be faster becaus
1f50: 65 0a 23 20 74 68 65 72 65 20 61 72 65 20 6e 6f  e.# there are no
1f60: 20 69 6e 64 69 63 65 73 20 74 6f 20 64 65 61 6c   indices to deal
1f70: 20 77 69 74 68 2e 0a 23 0a 73 70 65 65 64 5f 74   with..#.speed_t
1f80: 72 69 61 6c 20 73 70 65 65 64 31 70 2d 63 6f 70  rial speed1p-cop
1f90: 79 33 20 35 30 30 30 30 20 72 6f 77 20 7b 49 4e  y3 50000 row {IN
1fa0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
1fb0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 7d 0a 0a  ECT * FROM t2}..
1fc0: 23 20 53 65 6c 65 63 74 20 32 30 30 30 30 20 72  # Select 20000 r
1fd0: 6f 77 73 20 66 72 6f 6d 20 74 68 65 20 74 61 62  ows from the tab
1fe0: 6c 65 20 61 74 20 72 61 6e 64 6f 6d 2e 0a 23 0a  le at random..#.
1ff0: 65 78 70 6c 61 69 6e 20 7b 53 45 4c 45 43 54 20  explain {SELECT 
2000: 72 6f 77 69 64 20 46 52 4f 4d 20 74 31 20 4f 52  rowid FROM t1 OR
2010: 44 45 52 20 42 59 20 72 61 6e 64 6f 6d 28 29 20  DER BY random() 
2020: 4c 49 4d 49 54 20 32 30 30 30 30 7d 0a 73 70 65  LIMIT 20000}.spe
2030: 65 64 5f 74 72 69 61 6c 20 73 70 65 65 64 31 70  ed_trial speed1p
2040: 2d 72 61 6e 64 6f 6d 31 20 35 30 30 30 30 20 72  -random1 50000 r
2050: 6f 77 20 7b 0a 20 20 53 45 4c 45 43 54 20 72 6f  ow {.  SELECT ro
2060: 77 69 64 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  wid FROM t1 ORDE
2070: 52 20 42 59 20 72 61 6e 64 6f 6d 28 29 20 4c 49  R BY random() LI
2080: 4d 49 54 20 32 30 30 30 30 0a 7d 0a 0a 23 20 44  MIT 20000.}..# D
2090: 65 6c 65 74 65 20 32 30 30 30 30 20 72 61 6e 64  elete 20000 rand
20a0: 6f 6d 20 72 6f 77 73 20 66 72 6f 6d 20 74 68 65  om rows from the
20b0: 20 74 61 62 6c 65 2e 0a 23 0a 65 78 70 6c 61 69   table..#.explai
20c0: 6e 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  n {DELETE FROM t
20d0: 31 20 57 48 45 52 45 20 72 6f 77 69 64 20 49 4e  1 WHERE rowid IN
20e0: 0a 20 20 20 20 28 53 45 4c 45 43 54 20 72 6f 77  .    (SELECT row
20f0: 69 64 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52  id FROM t1 ORDER
2100: 20 42 59 20 72 61 6e 64 6f 6d 28 29 20 4c 49 4d   BY random() LIM
2110: 49 54 20 32 30 30 30 30 29 7d 0a 73 70 65 65 64  IT 20000)}.speed
2120: 5f 74 72 69 61 6c 20 73 70 65 65 64 31 70 2d 72  _trial speed1p-r
2130: 61 6e 64 6f 6d 2d 64 65 6c 31 20 32 30 30 30 30  andom-del1 20000
2140: 20 72 6f 77 20 7b 0a 20 20 44 45 4c 45 54 45 20   row {.  DELETE 
2150: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f  FROM t1 WHERE ro
2160: 77 69 64 20 49 4e 0a 20 20 20 20 28 53 45 4c 45  wid IN.    (SELE
2170: 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 74 31  CT rowid FROM t1
2180: 20 4f 52 44 45 52 20 42 59 20 72 61 6e 64 6f 6d   ORDER BY random
2190: 28 29 20 4c 49 4d 49 54 20 32 30 30 30 30 29 0a  () LIMIT 20000).
21a0: 7d 0a 64 6f 5f 74 65 73 74 20 73 70 65 65 64 31  }.do_test speed1
21b0: 70 2d 31 2e 31 20 7b 0a 20 20 64 62 20 6f 6e 65  p-1.1 {.  db one
21c0: 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   {SELECT count(*
21d0: 29 20 46 52 4f 4d 20 74 31 7d 0a 7d 20 33 30 30  ) FROM t1}.} 300
21e0: 30 30 0a 0a 20 20 20 20 0a 23 20 44 65 6c 65 74  00..    .# Delet
21f0: 65 20 32 30 30 30 30 20 6d 6f 72 65 20 72 6f 77  e 20000 more row
2200: 73 20 61 74 20 72 61 6e 64 6f 6d 20 66 72 6f 6d  s at random from
2210: 20 74 68 65 20 74 61 62 6c 65 2e 0a 23 0a 73 70   the table..#.sp
2220: 65 65 64 5f 74 72 69 61 6c 20 73 70 65 65 64 31  eed_trial speed1
2230: 70 2d 72 61 6e 64 6f 6d 2d 64 65 6c 32 20 32 30  p-random-del2 20
2240: 30 30 30 20 72 6f 77 20 7b 0a 20 20 44 45 4c 45  000 row {.  DELE
2250: 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  TE FROM t1 WHERE
2260: 20 72 6f 77 69 64 20 49 4e 0a 20 20 20 20 28 53   rowid IN.    (S
2270: 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
2280: 20 74 31 20 4f 52 44 45 52 20 42 59 20 72 61 6e   t1 ORDER BY ran
2290: 64 6f 6d 28 29 20 4c 49 4d 49 54 20 32 30 30 30  dom() LIMIT 2000
22a0: 30 29 0a 7d 0a 64 6f 5f 74 65 73 74 20 73 70 65  0).}.do_test spe
22b0: 65 64 31 70 2d 31 2e 32 20 7b 0a 20 20 64 62 20  ed1p-1.2 {.  db 
22c0: 6f 6e 65 20 7b 53 45 4c 45 43 54 20 63 6f 75 6e  one {SELECT coun
22d0: 74 28 2a 29 20 46 52 4f 4d 20 74 31 7d 0a 7d 20  t(*) FROM t1}.} 
22e0: 31 30 30 30 30 0a 73 70 65 65 64 5f 74 72 69 61  10000.speed_tria
22f0: 6c 5f 73 75 6d 6d 61 72 79 20 73 70 65 65 64 31  l_summary speed1
2300: 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a        ..finish_test.