/ Hex Artifact Content
Login

Artifact 85d90e6674d8298e3eaf82dbcef3abc2d5317f3e:


0000: 23 20 52 75 6e 20 74 68 69 73 20 54 43 4c 20 73  # Run this TCL s
0010: 63 72 69 70 74 20 75 73 69 6e 67 20 22 74 65 73  cript using "tes
0020: 74 66 69 78 74 75 72 65 22 20 69 6e 20 6f 72 64  tfixture" in ord
0030: 65 72 20 67 65 74 20 61 20 72 65 70 6f 72 74 20  er get a report 
0040: 74 68 61 74 20 73 68 6f 77 73 0a 23 20 68 6f 77  that shows.# how
0050: 20 6d 75 63 68 20 64 69 73 6b 20 73 70 61 63 65   much disk space
0060: 20 69 73 20 75 73 65 64 20 62 79 20 61 20 70 61   is used by a pa
0070: 72 74 69 63 75 6c 61 72 20 64 61 74 61 20 74 6f  rticular data to
0080: 20 61 63 74 75 61 6c 6c 79 20 73 74 6f 72 65 20   actually store 
0090: 64 61 74 61 0a 23 20 76 65 72 73 75 73 20 68 6f  data.# versus ho
00a0: 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
00b0: 75 6e 75 73 65 64 2e 0a 23 0a 0a 69 66 20 7b 5b  unused..#..if {[
00c0: 63 61 74 63 68 20 7b 0a 0a 23 20 41 72 67 75 6d  catch {..# Argum
00d0: 65 6e 74 20 24 74 6e 61 6d 65 20 69 73 20 74 68  ent $tname is th
00e0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  e name of a tabl
00f0: 65 20 77 69 74 68 69 6e 20 74 68 65 20 64 61 74  e within the dat
0100: 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 0a  abase opened by.
0110: 23 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  # database handl
0120: 65 20 5b 64 62 5d 2e 20 52 65 74 75 72 6e 20 74  e [db]. Return t
0130: 72 75 65 20 69 66 20 69 74 20 69 73 20 61 20 57  rue if it is a W
0140: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
0150: 6c 65 2c 20 6f 72 0a 23 20 66 61 6c 73 65 20 6f  le, or.# false o
0160: 74 68 65 72 77 69 73 65 2e 0a 23 0a 70 72 6f 63  therwise..#.proc
0170: 20 69 73 5f 77 69 74 68 6f 75 74 5f 72 6f 77 69   is_without_rowi
0180: 64 20 7b 74 6e 61 6d 65 7d 20 7b 0a 20 20 73 65  d {tname} {.  se
0190: 74 20 74 20 5b 73 74 72 69 6e 67 20 6d 61 70 20  t t [string map 
01a0: 7b 27 20 27 27 7d 20 24 74 6e 61 6d 65 5d 0a 20  {' ''} $tname]. 
01b0: 20 64 62 20 65 76 61 6c 20 22 50 52 41 47 4d 41   db eval "PRAGMA
01c0: 20 69 6e 64 65 78 5f 6c 69 73 74 20 3d 20 27 24   index_list = '$
01d0: 74 27 22 20 6f 20 7b 0a 20 20 20 20 69 66 20 7b  t'" o {.    if {
01e0: 24 6f 28 6f 72 69 67 69 6e 29 20 3d 3d 20 22 70  $o(origin) == "p
01f0: 6b 22 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20  k"} {.      set 
0200: 6e 20 24 6f 28 6e 61 6d 65 29 0a 20 20 20 20 20  n $o(name).     
0210: 20 69 66 20 7b 30 3d 3d 5b 64 62 20 6f 6e 65 20   if {0==[db one 
0220: 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
0230: 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  ) FROM sqlite_ma
0240: 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d 65 3d  ster WHERE name=
0250: 24 6e 20 7d 5d 7d 20 7b 0a 20 20 20 20 20 20 20  $n }]} {.       
0260: 20 72 65 74 75 72 6e 20 31 0a 20 20 20 20 20 20   return 1.      
0270: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
0280: 74 75 72 6e 20 30 0a 7d 0a 0a 23 20 47 65 74 20  turn 0.}..# Get 
0290: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
02a0: 64 61 74 61 62 61 73 65 20 74 6f 20 61 6e 61 6c  database to anal
02b0: 79 7a 65 0a 23 0a 70 72 6f 63 20 75 73 61 67 65  yze.#.proc usage
02c0: 20 7b 7d 20 7b 0a 20 20 73 65 74 20 61 72 67 76   {} {.  set argv
02d0: 30 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65  0 [file rootname
02e0: 20 5b 66 69 6c 65 20 74 61 69 6c 20 5b 69 6e 66   [file tail [inf
02f0: 6f 20 6e 61 6d 65 6f 66 65 78 65 63 75 74 61 62  o nameofexecutab
0300: 6c 65 5d 5d 5d 0a 20 20 70 75 74 73 20 73 74 64  le]]].  puts std
0310: 65 72 72 20 22 55 73 61 67 65 3a 20 24 61 72 67  err "Usage: $arg
0320: 76 30 20 3f 2d 2d 70 61 67 65 69 6e 66 6f 3f 20  v0 ?--pageinfo? 
0330: 3f 2d 2d 73 74 61 74 73 3f 20 64 61 74 61 62 61  ?--stats? databa
0340: 73 65 2d 66 69 6c 65 6e 61 6d 65 22 0a 20 20 70  se-filename".  p
0350: 75 74 73 20 73 74 64 65 72 72 20 7b 0a 41 6e 61  uts stderr {.Ana
0360: 6c 79 7a 65 20 74 68 65 20 53 51 4c 69 74 65 33  lyze the SQLite3
0370: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
0380: 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65 20  pecified by the 
0390: 22 64 61 74 61 62 61 73 65 2d 66 69 6c 65 6e 61  "database-filena
03a0: 6d 65 22 0a 61 72 67 75 6d 65 6e 74 20 61 6e 64  me".argument and
03b0: 20 6f 75 74 70 75 74 20 61 20 72 65 70 6f 72 74   output a report
03c0: 20 64 65 74 61 69 6c 69 6e 67 20 73 69 7a 65 20   detailing size 
03d0: 61 6e 64 20 73 74 6f 72 61 67 65 20 65 66 66 69  and storage effi
03e0: 63 69 65 6e 63 79 0a 69 6e 66 6f 72 6d 61 74 69  ciency.informati
03f0: 6f 6e 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  on for the datab
0400: 61 73 65 20 61 6e 64 20 69 74 73 20 63 6f 6e 73  ase and its cons
0410: 74 69 74 75 65 6e 74 20 74 61 62 6c 65 73 20 61  tituent tables a
0420: 6e 64 20 69 6e 64 65 78 65 73 2e 0a 0a 4f 70 74  nd indexes...Opt
0430: 69 6f 6e 73 3a 0a 0a 20 20 20 2d 2d 73 74 61 74  ions:..   --stat
0440: 73 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20  s        Output 
0450: 53 51 4c 20 74 65 78 74 20 74 68 61 74 20 63 72  SQL text that cr
0460: 65 61 74 65 73 20 61 20 6e 65 77 20 64 61 74 61  eates a new data
0470: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  base containing.
0480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0490: 20 20 73 74 61 74 69 73 74 69 63 73 20 61 62 6f    statistics abo
04a0: 75 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ut the database 
04b0: 74 68 61 74 20 77 61 73 20 61 6e 61 6c 79 7a 65  that was analyze
04c0: 64 0a 0a 20 20 20 2d 2d 70 61 67 65 69 6e 66 6f  d..   --pageinfo
04d0: 20 20 20 20 20 53 68 6f 77 20 68 6f 77 20 65 61       Show how ea
04e0: 63 68 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  ch page of the d
04f0: 61 74 61 62 61 73 65 2d 66 69 6c 65 20 69 73 20  atabase-file is 
0500: 75 73 65 64 0a 7d 0a 20 20 65 78 69 74 20 31 0a  used.}.  exit 1.
0510: 7d 0a 73 65 74 20 66 69 6c 65 5f 74 6f 5f 61 6e  }.set file_to_an
0520: 61 6c 79 7a 65 20 7b 7d 0a 73 65 74 20 66 6c 61  alyze {}.set fla
0530: 67 73 28 2d 70 61 67 65 69 6e 66 6f 29 20 30 0a  gs(-pageinfo) 0.
0540: 73 65 74 20 66 6c 61 67 73 28 2d 73 74 61 74 73  set flags(-stats
0550: 29 20 30 0a 61 70 70 65 6e 64 20 61 72 67 76 20  ) 0.append argv 
0560: 7b 7d 0a 66 6f 72 65 61 63 68 20 61 72 67 20 24  {}.foreach arg $
0570: 61 72 67 76 20 7b 0a 20 20 69 66 20 7b 5b 72 65  argv {.  if {[re
0580: 67 65 78 70 20 7b 5e 2d 2b 70 61 67 65 69 6e 66  gexp {^-+pageinf
0590: 6f 24 7d 20 24 61 72 67 5d 7d 20 7b 0a 20 20 20  o$} $arg]} {.   
05a0: 20 73 65 74 20 66 6c 61 67 73 28 2d 70 61 67 65   set flags(-page
05b0: 69 6e 66 6f 29 20 31 0a 20 20 7d 20 65 6c 73 65  info) 1.  } else
05c0: 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e 2d 2b  if {[regexp {^-+
05d0: 73 74 61 74 73 24 7d 20 24 61 72 67 5d 7d 20 7b  stats$} $arg]} {
05e0: 0a 20 20 20 20 73 65 74 20 66 6c 61 67 73 28 2d  .    set flags(-
05f0: 73 74 61 74 73 29 20 31 0a 20 20 7d 20 65 6c 73  stats) 1.  } els
0600: 65 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e 2d  eif {[regexp {^-
0610: 7d 20 24 61 72 67 5d 7d 20 7b 0a 20 20 20 20 70  } $arg]} {.    p
0620: 75 74 73 20 73 74 64 65 72 72 20 22 55 6e 6b 6e  uts stderr "Unkn
0630: 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 24 61 72 67  own option: $arg
0640: 22 0a 20 20 20 20 75 73 61 67 65 0a 20 20 7d 20  ".    usage.  } 
0650: 65 6c 73 65 69 66 20 7b 24 66 69 6c 65 5f 74 6f  elseif {$file_to
0660: 5f 61 6e 61 6c 79 7a 65 21 3d 22 22 7d 20 7b 0a  _analyze!=""} {.
0670: 20 20 20 20 75 73 61 67 65 0a 20 20 7d 20 65 6c      usage.  } el
0680: 73 65 20 7b 0a 20 20 20 20 73 65 74 20 66 69 6c  se {.    set fil
0690: 65 5f 74 6f 5f 61 6e 61 6c 79 7a 65 20 24 61 72  e_to_analyze $ar
06a0: 67 0a 20 20 7d 0a 7d 0a 69 66 20 7b 24 66 69 6c  g.  }.}.if {$fil
06b0: 65 5f 74 6f 5f 61 6e 61 6c 79 7a 65 3d 3d 22 22  e_to_analyze==""
06c0: 7d 20 75 73 61 67 65 0a 73 65 74 20 72 6f 6f 74  } usage.set root
06d0: 5f 66 69 6c 65 6e 61 6d 65 20 24 66 69 6c 65 5f  _filename $file_
06e0: 74 6f 5f 61 6e 61 6c 79 7a 65 0a 72 65 67 65 78  to_analyze.regex
06f0: 70 20 7b 5e 66 69 6c 65 3a 28 2f 2f 29 3f 28 5b  p {^file:(//)?([
0700: 5e 3f 5d 2a 29 7d 20 24 66 69 6c 65 5f 74 6f 5f  ^?]*)} $file_to_
0710: 61 6e 61 6c 79 7a 65 20 61 6c 6c 20 78 31 20 72  analyze all x1 r
0720: 6f 6f 74 5f 66 69 6c 65 6e 61 6d 65 0a 69 66 20  oot_filename.if 
0730: 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  {![file exists $
0740: 72 6f 6f 74 5f 66 69 6c 65 6e 61 6d 65 5d 7d 20  root_filename]} 
0750: 7b 0a 20 20 70 75 74 73 20 73 74 64 65 72 72 20  {.  puts stderr 
0760: 22 4e 6f 20 73 75 63 68 20 66 69 6c 65 3a 20 24  "No such file: $
0770: 72 6f 6f 74 5f 66 69 6c 65 6e 61 6d 65 22 0a 20  root_filename". 
0780: 20 65 78 69 74 20 31 0a 7d 0a 69 66 20 7b 21 5b   exit 1.}.if {![
0790: 66 69 6c 65 20 72 65 61 64 61 62 6c 65 20 24 72  file readable $r
07a0: 6f 6f 74 5f 66 69 6c 65 6e 61 6d 65 5d 7d 20 7b  oot_filename]} {
07b0: 0a 20 20 70 75 74 73 20 73 74 64 65 72 72 20 22  .  puts stderr "
07c0: 46 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 64  File is not read
07d0: 61 62 6c 65 3a 20 24 72 6f 6f 74 5f 66 69 6c 65  able: $root_file
07e0: 6e 61 6d 65 22 0a 20 20 65 78 69 74 20 31 0a 7d  name".  exit 1.}
07f0: 0a 73 65 74 20 74 72 75 65 5f 66 69 6c 65 5f 73  .set true_file_s
0800: 69 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65 20 24  ize [file size $
0810: 72 6f 6f 74 5f 66 69 6c 65 6e 61 6d 65 5d 0a 69  root_filename].i
0820: 66 20 7b 24 74 72 75 65 5f 66 69 6c 65 5f 73 69  f {$true_file_si
0830: 7a 65 3c 35 31 32 7d 20 7b 0a 20 20 70 75 74 73  ze<512} {.  puts
0840: 20 73 74 64 65 72 72 20 22 45 6d 70 74 79 20 6f   stderr "Empty o
0850: 72 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61  r malformed data
0860: 62 61 73 65 3a 20 24 72 6f 6f 74 5f 66 69 6c 65  base: $root_file
0870: 6e 61 6d 65 22 0a 20 20 65 78 69 74 20 31 0a 7d  name".  exit 1.}
0880: 0a 0a 23 20 43 6f 6d 70 75 74 65 20 74 68 65 20  ..# Compute the 
0890: 74 6f 74 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  total file size 
08a0: 61 73 73 75 6d 69 6e 67 20 74 65 73 74 5f 6d 75  assuming test_mu
08b0: 6c 74 69 70 6c 65 78 6f 72 20 69 73 20 62 65 69  ltiplexor is bei
08c0: 6e 67 20 75 73 65 64 2e 0a 23 20 41 73 73 75 6d  ng used..# Assum
08d0: 65 20 74 68 61 74 20 53 51 4c 49 54 45 5f 45 4e  e that SQLITE_EN
08e0: 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6d  ABLE_8_3_NAMES m
08f0: 69 67 68 74 20 62 65 20 65 6e 61 62 6c 65 64 0a  ight be enabled.
0900: 23 0a 73 65 74 20 65 78 74 65 6e 73 69 6f 6e 20  #.set extension 
0910: 5b 66 69 6c 65 20 65 78 74 65 6e 73 69 6f 6e 20  [file extension 
0920: 24 72 6f 6f 74 5f 66 69 6c 65 6e 61 6d 65 5d 0a  $root_filename].
0930: 73 65 74 20 70 61 74 74 65 72 6e 20 24 72 6f 6f  set pattern $roo
0940: 74 5f 66 69 6c 65 6e 61 6d 65 0a 61 70 70 65 6e  t_filename.appen
0950: 64 20 70 61 74 74 65 72 6e 20 7b 5b 30 2d 33 5d  d pattern {[0-3]
0960: 5b 30 2d 39 5d 5b 30 2d 39 5d 7d 0a 66 6f 72 65  [0-9][0-9]}.fore
0970: 61 63 68 20 66 20 5b 67 6c 6f 62 20 2d 6e 6f 63  ach f [glob -noc
0980: 6f 6d 70 6c 61 69 6e 20 24 70 61 74 74 65 72 6e  omplain $pattern
0990: 5d 20 7b 0a 20 20 69 6e 63 72 20 74 72 75 65 5f  ] {.  incr true_
09a0: 66 69 6c 65 5f 73 69 7a 65 20 5b 66 69 6c 65 20  file_size [file 
09b0: 73 69 7a 65 20 24 66 5d 0a 20 20 73 65 74 20 65  size $f].  set e
09c0: 78 74 65 6e 73 69 6f 6e 20 7b 7d 0a 7d 0a 69 66  xtension {}.}.if
09d0: 20 7b 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68   {[string length
09e0: 20 24 65 78 74 65 6e 73 69 6f 6e 5d 3e 3d 32 20   $extension]>=2 
09f0: 26 26 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74  && [string lengt
0a00: 68 20 24 65 78 74 65 6e 73 69 6f 6e 5d 3c 3d 34  h $extension]<=4
0a10: 7d 20 7b 0a 20 20 73 65 74 20 70 61 74 74 65 72  } {.  set patter
0a20: 6e 20 5b 66 69 6c 65 20 72 6f 6f 74 6e 61 6d 65  n [file rootname
0a30: 20 24 72 6f 6f 74 5f 66 69 6c 65 6e 61 6d 65 5d   $root_filename]
0a40: 0a 20 20 61 70 70 65 6e 64 20 70 61 74 74 65 72  .  append patter
0a50: 6e 20 7b 2e 5b 30 2d 33 5d 5b 30 2d 39 5d 5b 30  n {.[0-3][0-9][0
0a60: 2d 39 5d 7d 0a 20 20 66 6f 72 65 61 63 68 20 66  -9]}.  foreach f
0a70: 20 5b 67 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61   [glob -nocompla
0a80: 69 6e 20 24 70 61 74 74 65 72 6e 5d 20 7b 0a 20  in $pattern] {. 
0a90: 20 20 20 69 6e 63 72 20 74 72 75 65 5f 66 69 6c     incr true_fil
0aa0: 65 5f 73 69 7a 65 20 5b 66 69 6c 65 20 73 69 7a  e_size [file siz
0ab0: 65 20 24 66 5d 0a 20 20 7d 0a 7d 0a 0a 23 20 4f  e $f].  }.}..# O
0ac0: 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
0ad0: 0a 23 0a 69 66 20 7b 5b 63 61 74 63 68 20 7b 73  .#.if {[catch {s
0ae0: 71 6c 69 74 65 33 20 64 62 20 24 66 69 6c 65 5f  qlite3 db $file_
0af0: 74 6f 5f 61 6e 61 6c 79 7a 65 20 2d 75 72 69 20  to_analyze -uri 
0b00: 31 7d 20 6d 73 67 5d 7d 20 7b 0a 20 20 70 75 74  1} msg]} {.  put
0b10: 73 20 73 74 64 65 72 72 20 22 65 72 72 6f 72 20  s stderr "error 
0b20: 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 20 24  trying to open $
0b30: 66 69 6c 65 5f 74 6f 5f 61 6e 61 6c 79 7a 65 3a  file_to_analyze:
0b40: 20 24 6d 73 67 22 0a 20 20 65 78 69 74 20 31 0a   $msg".  exit 1.
0b50: 7d 0a 0a 64 62 20 65 76 61 6c 20 7b 53 45 4c 45  }..db eval {SELE
0b60: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
0b70: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 7d 0a   sqlite_master}.
0b80: 73 65 74 20 70 61 67 65 53 69 7a 65 20 5b 65 78  set pageSize [ex
0b90: 70 72 20 7b 77 69 64 65 28 5b 64 62 20 6f 6e 65  pr {wide([db one
0ba0: 20 7b 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69   {PRAGMA page_si
0bb0: 7a 65 7d 5d 29 7d 5d 0a 0a 69 66 20 7b 24 66 6c  ze}])}]..if {$fl
0bc0: 61 67 73 28 2d 70 61 67 65 69 6e 66 6f 29 7d 20  ags(-pageinfo)} 
0bd0: 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b 43 52 45  {.  db eval {CRE
0be0: 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
0bf0: 45 20 74 65 6d 70 2e 73 74 61 74 20 55 53 49 4e  E temp.stat USIN
0c00: 47 20 64 62 73 74 61 74 7d 0a 20 20 64 62 20 65  G dbstat}.  db e
0c10: 76 61 6c 20 7b 53 45 4c 45 43 54 20 6e 61 6d 65  val {SELECT name
0c20: 2c 20 70 61 74 68 2c 20 70 61 67 65 6e 6f 20 46  , path, pageno F
0c30: 52 4f 4d 20 74 65 6d 70 2e 73 74 61 74 20 4f 52  ROM temp.stat OR
0c40: 44 45 52 20 42 59 20 70 61 67 65 6e 6f 7d 20 7b  DER BY pageno} {
0c50: 0a 20 20 20 20 70 75 74 73 20 22 24 70 61 67 65  .    puts "$page
0c60: 6e 6f 20 24 6e 61 6d 65 20 24 70 61 74 68 22 0a  no $name $path".
0c70: 20 20 7d 0a 20 20 65 78 69 74 20 30 0a 7d 0a 69    }.  exit 0.}.i
0c80: 66 20 7b 24 66 6c 61 67 73 28 2d 73 74 61 74 73  f {$flags(-stats
0c90: 29 7d 20 7b 0a 20 20 64 62 20 65 76 61 6c 20 7b  )} {.  db eval {
0ca0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
0cb0: 41 42 4c 45 20 74 65 6d 70 2e 73 74 61 74 20 55  ABLE temp.stat U
0cc0: 53 49 4e 47 20 64 62 73 74 61 74 7d 0a 20 20 70  SING dbstat}.  p
0cd0: 75 74 73 20 22 42 45 47 49 4e 3b 22 0a 20 20 70  uts "BEGIN;".  p
0ce0: 75 74 73 20 22 43 52 45 41 54 45 20 54 41 42 4c  uts "CREATE TABL
0cf0: 45 20 73 74 61 74 73 28 22 0a 20 20 70 75 74 73  E stats(".  puts
0d00: 20 22 20 20 6e 61 6d 65 20 20 20 20 20 20 20 53   "  name       S
0d10: 54 52 49 4e 47 2c 20 20 20 20 20 20 20 20 20 20  TRING,          
0d20: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c   /* Name of tabl
0d30: 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 22 0a 20  e or index */". 
0d40: 20 70 75 74 73 20 22 20 20 70 61 74 68 20 20 20   puts "  path   
0d50: 20 20 20 20 49 4e 54 45 47 45 52 2c 20 20 20 20      INTEGER,    
0d60: 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 74 6f        /* Path to
0d70: 20 70 61 67 65 20 66 72 6f 6d 20 72 6f 6f 74 20   page from root 
0d80: 2a 2f 22 0a 20 20 70 75 74 73 20 22 20 20 70 61  */".  puts "  pa
0d90: 67 65 6e 6f 20 20 20 20 20 49 4e 54 45 47 45 52  geno     INTEGER
0da0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
0db0: 67 65 20 6e 75 6d 62 65 72 20 2a 2f 22 0a 20 20  ge number */".  
0dc0: 70 75 74 73 20 22 20 20 70 61 67 65 74 79 70 65  puts "  pagetype
0dd0: 20 20 20 53 54 52 49 4e 47 2c 20 20 20 20 20 20     STRING,      
0de0: 20 20 20 20 20 2f 2a 20 27 69 6e 74 65 72 6e 61       /* 'interna
0df0: 6c 27 2c 20 27 6c 65 61 66 27 20 6f 72 20 27 6f  l', 'leaf' or 'o
0e00: 76 65 72 66 6c 6f 77 27 20 2a 2f 22 0a 20 20 70  verflow' */".  p
0e10: 75 74 73 20 22 20 20 6e 63 65 6c 6c 20 20 20 20  uts "  ncell    
0e20: 20 20 49 4e 54 45 47 45 52 2c 20 20 20 20 20 20    INTEGER,      
0e30: 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20 6f 6e 20      /* Cells on 
0e40: 70 61 67 65 20 28 30 20 66 6f 72 20 6f 76 65 72  page (0 for over
0e50: 66 6c 6f 77 29 20 2a 2f 22 0a 20 20 70 75 74 73  flow) */".  puts
0e60: 20 22 20 20 70 61 79 6c 6f 61 64 20 20 20 20 49   "  payload    I
0e70: 4e 54 45 47 45 52 2c 20 20 20 20 20 20 20 20 20  NTEGER,         
0e80: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70 61 79   /* Bytes of pay
0e90: 6c 6f 61 64 20 6f 6e 20 74 68 69 73 20 70 61 67  load on this pag
0ea0: 65 20 2a 2f 22 0a 20 20 70 75 74 73 20 22 20 20  e */".  puts "  
0eb0: 75 6e 75 73 65 64 20 20 20 20 20 49 4e 54 45 47  unused     INTEG
0ec0: 45 52 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ER,          /* 
0ed0: 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  Bytes of unused 
0ee0: 73 70 61 63 65 20 6f 6e 20 74 68 69 73 20 70 61  space on this pa
0ef0: 67 65 20 2a 2f 22 0a 20 20 70 75 74 73 20 22 20  ge */".  puts " 
0f00: 20 6d 78 5f 70 61 79 6c 6f 61 64 20 49 4e 54 45   mx_payload INTE
0f10: 47 45 52 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  GER,          /*
0f20: 20 4c 61 72 67 65 73 74 20 70 61 79 6c 6f 61 64   Largest payload
0f30: 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
0f40: 6c 73 20 2a 2f 22 0a 20 20 70 75 74 73 20 22 20  ls */".  puts " 
0f50: 20 70 67 6f 66 66 73 65 74 20 20 20 49 4e 54 45   pgoffset   INTE
0f60: 47 45 52 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  GER,          /*
0f70: 20 4f 66 66 73 65 74 20 6f 66 20 70 61 67 65 20   Offset of page 
0f80: 69 6e 20 66 69 6c 65 20 2a 2f 22 0a 20 20 70 75  in file */".  pu
0f90: 74 73 20 22 20 20 70 67 73 69 7a 65 20 20 20 20  ts "  pgsize    
0fa0: 20 49 4e 54 45 47 45 52 20 20 20 20 20 20 20 20   INTEGER        
0fb0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
0fc0: 65 20 70 61 67 65 20 2a 2f 22 0a 20 20 70 75 74  e page */".  put
0fd0: 73 20 22 29 3b 22 0a 20 20 64 62 20 65 76 61 6c  s ");".  db eval
0fe0: 20 7b 53 45 4c 45 43 54 20 71 75 6f 74 65 28 6e   {SELECT quote(n
0ff0: 61 6d 65 29 20 7c 7c 20 27 2c 27 20 7c 7c 0a 20  ame) || ',' ||. 
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1010: 20 71 75 6f 74 65 28 70 61 74 68 29 20 7c 7c 20   quote(path) || 
1020: 27 2c 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ',' ||.         
1030: 20 20 20 20 20 20 20 20 20 71 75 6f 74 65 28 70           quote(p
1040: 61 67 65 6e 6f 29 20 7c 7c 20 27 2c 27 20 7c 7c  ageno) || ',' ||
1050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1060: 20 20 20 71 75 6f 74 65 28 70 61 67 65 74 79 70     quote(pagetyp
1070: 65 29 20 7c 7c 20 27 2c 27 20 7c 7c 0a 20 20 20  e) || ',' ||.   
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 71                 q
1090: 75 6f 74 65 28 6e 63 65 6c 6c 29 20 7c 7c 20 27  uote(ncell) || '
10a0: 2c 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  ,' ||.          
10b0: 20 20 20 20 20 20 20 20 71 75 6f 74 65 28 70 61          quote(pa
10c0: 79 6c 6f 61 64 29 20 7c 7c 20 27 2c 27 20 7c 7c  yload) || ',' ||
10d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10e0: 20 20 20 71 75 6f 74 65 28 75 6e 75 73 65 64 29     quote(unused)
10f0: 20 7c 7c 20 27 2c 27 20 7c 7c 0a 20 20 20 20 20   || ',' ||.     
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 71 75 6f               quo
1110: 74 65 28 6d 78 5f 70 61 79 6c 6f 61 64 29 20 7c  te(mx_payload) |
1120: 7c 20 27 2c 27 20 7c 7c 0a 20 20 20 20 20 20 20  | ',' ||.       
1130: 20 20 20 20 20 20 20 20 20 20 20 71 75 6f 74 65             quote
1140: 28 70 67 6f 66 66 73 65 74 29 20 7c 7c 20 27 2c  (pgoffset) || ',
1150: 27 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ' ||.           
1160: 20 20 20 20 20 20 20 71 75 6f 74 65 28 70 67 73         quote(pgs
1170: 69 7a 65 29 20 41 53 20 78 20 46 52 4f 4d 20 73  ize) AS x FROM s
1180: 74 61 74 7d 20 7b 0a 20 20 20 20 70 75 74 73 20  tat} {.    puts 
1190: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 74 61  "INSERT INTO sta
11a0: 74 73 20 56 41 4c 55 45 53 28 24 78 29 3b 22 0a  ts VALUES($x);".
11b0: 20 20 7d 0a 20 20 70 75 74 73 20 22 43 4f 4d 4d    }.  puts "COMM
11c0: 49 54 3b 22 0a 20 20 65 78 69 74 20 30 0a 7d 0a  IT;".  exit 0.}.
11d0: 0a 23 20 49 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  .# In-memory dat
11e0: 61 62 61 73 65 20 66 6f 72 20 63 6f 6c 6c 65 63  abase for collec
11f0: 74 69 6e 67 20 73 74 61 74 69 73 74 69 63 73 2e  ting statistics.
1200: 20 54 68 69 73 20 73 63 72 69 70 74 20 6c 6f 6f   This script loo
1210: 70 73 20 74 68 72 6f 75 67 68 0a 23 20 74 68 65  ps through.# the
1220: 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69   tables and indi
1230: 63 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ces in the datab
1240: 61 73 65 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  ase being analyz
1250: 65 64 2c 20 61 64 64 69 6e 67 20 61 20 72 6f 77  ed, adding a row
1260: 20 66 6f 72 20 65 61 63 68 0a 23 20 74 6f 20 61   for each.# to a
1270: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
1280: 62 61 73 65 20 28 66 6f 72 20 77 68 69 63 68 20  base (for which 
1290: 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 73 68  the schema is sh
12a0: 6f 77 6e 20 62 65 6c 6f 77 29 2e 20 49 74 20 74  own below). It t
12b0: 68 65 6e 0a 23 20 71 75 65 72 69 65 73 20 74 68  hen.# queries th
12c0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 20 74  e in-memory db t
12d0: 6f 20 70 72 6f 64 75 63 65 20 74 68 65 20 73 70  o produce the sp
12e0: 61 63 65 2d 61 6e 61 6c 79 73 69 73 20 72 65 70  ace-analysis rep
12f0: 6f 72 74 2e 0a 23 0a 73 71 6c 69 74 65 33 20 6d  ort..#.sqlite3 m
1300: 65 6d 20 3a 6d 65 6d 6f 72 79 3a 0a 73 65 74 20  em :memory:.set 
1310: 74 61 62 6c 65 64 65 66 20 7b 43 52 45 41 54 45  tabledef {CREATE
1320: 20 54 41 42 4c 45 20 73 70 61 63 65 5f 75 73 65   TABLE space_use
1330: 64 28 0a 20 20 20 6e 61 6d 65 20 63 6c 6f 62 2c  d(.   name clob,
1340: 20 20 20 20 20 20 20 20 2d 2d 20 4e 61 6d 65 20          -- Name 
1350: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
1360: 64 65 78 20 69 6e 20 74 68 65 20 64 61 74 61 62  dex in the datab
1370: 61 73 65 20 66 69 6c 65 0a 20 20 20 74 62 6c 6e  ase file.   tbln
1380: 61 6d 65 20 63 6c 6f 62 2c 20 20 20 20 20 2d 2d  ame clob,     --
1390: 20 4e 61 6d 65 20 6f 66 20 61 73 73 6f 63 69 61   Name of associa
13a0: 74 65 64 20 74 61 62 6c 65 0a 20 20 20 69 73 5f  ted table.   is_
13b0: 69 6e 64 65 78 20 62 6f 6f 6c 65 61 6e 2c 20 2d  index boolean, -
13c0: 2d 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  - TRUE if it is 
13d0: 61 6e 20 69 6e 64 65 78 2c 20 66 61 6c 73 65 20  an index, false 
13e0: 66 6f 72 20 61 20 74 61 62 6c 65 0a 20 20 20 69  for a table.   i
13f0: 73 5f 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 20  s_without_rowid 
1400: 62 6f 6f 6c 65 61 6e 2c 20 2d 2d 20 54 52 55 45  boolean, -- TRUE
1410: 20 69 66 20 57 49 54 48 4f 55 54 20 52 4f 57 49   if WITHOUT ROWI
1420: 44 20 74 61 62 6c 65 20 20 0a 20 20 20 6e 65 6e  D table  .   nen
1430: 74 72 79 20 69 6e 74 2c 20 20 20 20 20 20 20 2d  try int,       -
1440: 2d 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  - Number of entr
1450: 69 65 73 20 69 6e 20 74 68 65 20 42 54 72 65 65  ies in the BTree
1460: 0a 20 20 20 6c 65 61 66 5f 65 6e 74 72 69 65 73  .   leaf_entries
1470: 20 69 6e 74 2c 20 2d 2d 20 4e 75 6d 62 65 72 20   int, -- Number 
1480: 6f 66 20 6c 65 61 66 20 65 6e 74 72 69 65 73 0a  of leaf entries.
1490: 20 20 20 64 65 70 74 68 20 69 6e 74 2c 20 20 20     depth int,   
14a0: 20 20 20 20 20 2d 2d 20 44 65 70 74 68 20 6f 66       -- Depth of
14b0: 20 74 68 65 20 62 2d 74 72 65 65 0a 20 20 20 70   the b-tree.   p
14c0: 61 79 6c 6f 61 64 20 69 6e 74 2c 20 20 20 20 20  ayload int,     
14d0: 20 2d 2d 20 54 6f 74 61 6c 20 61 6d 6f 75 6e 74   -- Total amount
14e0: 20 6f 66 20 64 61 74 61 20 73 74 6f 72 65 64 20   of data stored 
14f0: 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 6f 72  in this table or
1500: 20 69 6e 64 65 78 0a 20 20 20 6f 76 66 6c 5f 70   index.   ovfl_p
1510: 61 79 6c 6f 61 64 20 69 6e 74 2c 20 2d 2d 20 54  ayload int, -- T
1520: 6f 74 61 6c 20 61 6d 6f 75 6e 74 20 6f 66 20 64  otal amount of d
1530: 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 6f 76  ata stored on ov
1540: 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20  erflow pages.   
1550: 6f 76 66 6c 5f 63 6e 74 20 69 6e 74 2c 20 20 20  ovfl_cnt int,   
1560: 20 20 2d 2d 20 4e 75 6d 62 65 72 20 6f 66 20 65    -- Number of e
1570: 6e 74 72 69 65 73 20 74 68 61 74 20 75 73 65 20  ntries that use 
1580: 6f 76 65 72 66 6c 6f 77 0a 20 20 20 6d 78 5f 70  overflow.   mx_p
1590: 61 79 6c 6f 61 64 20 69 6e 74 2c 20 20 20 2d 2d  ayload int,   --
15a0: 20 4d 61 78 69 6d 75 6d 20 70 61 79 6c 6f 61 64   Maximum payload
15b0: 20 73 69 7a 65 0a 20 20 20 69 6e 74 5f 70 61 67   size.   int_pag
15c0: 65 73 20 69 6e 74 2c 20 20 20 20 2d 2d 20 4e 75  es int,    -- Nu
15d0: 6d 62 65 72 20 6f 66 20 69 6e 74 65 72 69 6f 72  mber of interior
15e0: 20 70 61 67 65 73 20 75 73 65 64 0a 20 20 20 6c   pages used.   l
15f0: 65 61 66 5f 70 61 67 65 73 20 69 6e 74 2c 20 20  eaf_pages int,  
1600: 20 2d 2d 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   -- Number of le
1610: 61 66 20 70 61 67 65 73 20 75 73 65 64 0a 20 20  af pages used.  
1620: 20 6f 76 66 6c 5f 70 61 67 65 73 20 69 6e 74 2c   ovfl_pages int,
1630: 20 20 20 2d 2d 20 4e 75 6d 62 65 72 20 6f 66 20     -- Number of 
1640: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75  overflow pages u
1650: 73 65 64 0a 20 20 20 69 6e 74 5f 75 6e 75 73 65  sed.   int_unuse
1660: 64 20 69 6e 74 2c 20 20 20 2d 2d 20 4e 75 6d 62  d int,   -- Numb
1670: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
1680: 65 73 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70  es on interior p
1690: 61 67 65 73 0a 20 20 20 6c 65 61 66 5f 75 6e 75  ages.   leaf_unu
16a0: 73 65 64 20 69 6e 74 2c 20 20 2d 2d 20 4e 75 6d  sed int,  -- Num
16b0: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
16c0: 74 65 73 20 6f 6e 20 70 72 69 6d 61 72 79 20 70  tes on primary p
16d0: 61 67 65 73 0a 20 20 20 6f 76 66 6c 5f 75 6e 75  ages.   ovfl_unu
16e0: 73 65 64 20 69 6e 74 2c 20 20 2d 2d 20 4e 75 6d  sed int,  -- Num
16f0: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
1700: 74 65 73 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  tes on overflow 
1710: 70 61 67 65 73 0a 20 20 20 67 61 70 5f 63 6e 74  pages.   gap_cnt
1720: 20 69 6e 74 2c 20 20 20 20 20 20 2d 2d 20 4e 75   int,      -- Nu
1730: 6d 62 65 72 20 6f 66 20 67 61 70 73 20 69 6e 20  mber of gaps in 
1740: 74 68 65 20 70 61 67 65 20 6c 61 79 6f 75 74 0a  the page layout.
1750: 20 20 20 63 6f 6d 70 72 65 73 73 65 64 5f 73 69     compressed_si
1760: 7a 65 20 69 6e 74 20 20 2d 2d 20 54 6f 74 61 6c  ze int  -- Total
1770: 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e   bytes stored on
1780: 20 64 69 73 6b 0a 29 3b 7d 0a 6d 65 6d 20 65 76   disk.);}.mem ev
1790: 61 6c 20 24 74 61 62 6c 65 64 65 66 0a 0a 23 20  al $tabledef..# 
17a0: 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
17b0: 72 79 20 22 64 62 73 74 61 74 22 20 76 69 72 74  ry "dbstat" virt
17c0: 75 61 6c 20 74 61 62 6c 65 2e 0a 23 0a 64 62 20  ual table..#.db 
17d0: 65 76 61 6c 20 7b 43 52 45 41 54 45 20 56 49 52  eval {CREATE VIR
17e0: 54 55 41 4c 20 54 41 42 4c 45 20 74 65 6d 70 2e  TUAL TABLE temp.
17f0: 73 74 61 74 20 55 53 49 4e 47 20 64 62 73 74 61  stat USING dbsta
1800: 74 7d 0a 64 62 20 65 76 61 6c 20 7b 43 52 45 41  t}.db eval {CREA
1810: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 64 62  TE TEMP TABLE db
1820: 73 74 61 74 20 41 53 20 53 45 4c 45 43 54 20 2a  stat AS SELECT *
1830: 20 46 52 4f 4d 20 74 65 6d 70 2e 73 74 61 74 0a   FROM temp.stat.
1840: 20 20 20 20 20 20 20 20 20 4f 52 44 45 52 20 42           ORDER B
1850: 59 20 6e 61 6d 65 2c 20 70 61 74 68 7d 0a 64 62  Y name, path}.db
1860: 20 65 76 61 6c 20 7b 44 52 4f 50 20 54 41 42 4c   eval {DROP TABL
1870: 45 20 74 65 6d 70 2e 73 74 61 74 7d 0a 0a 73 65  E temp.stat}..se
1880: 74 20 69 73 43 6f 6d 70 72 65 73 73 65 64 20 30  t isCompressed 0
1890: 0a 73 65 74 20 63 6f 6d 70 72 65 73 73 4f 76 65  .set compressOve
18a0: 72 68 65 61 64 20 30 0a 73 65 74 20 64 65 70 74  rhead 0.set dept
18b0: 68 20 30 0a 73 65 74 20 73 71 6c 20 7b 20 53 45  h 0.set sql { SE
18c0: 4c 45 43 54 20 6e 61 6d 65 2c 20 74 62 6c 5f 6e  LECT name, tbl_n
18d0: 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ame FROM sqlite_
18e0: 6d 61 73 74 65 72 20 57 48 45 52 45 20 72 6f 6f  master WHERE roo
18f0: 74 70 61 67 65 3e 30 20 7d 0a 66 6f 72 65 61 63  tpage>0 }.foreac
1900: 68 20 7b 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 7d  h {name tblname}
1910: 20 5b 63 6f 6e 63 61 74 20 73 71 6c 69 74 65 5f   [concat sqlite_
1920: 6d 61 73 74 65 72 20 73 71 6c 69 74 65 5f 6d 61  master sqlite_ma
1930: 73 74 65 72 20 5b 64 62 20 65 76 61 6c 20 24 73  ster [db eval $s
1940: 71 6c 5d 5d 20 7b 0a 0a 20 20 73 65 74 20 69 73  ql]] {..  set is
1950: 5f 69 6e 64 65 78 20 5b 65 78 70 72 20 7b 24 6e  _index [expr {$n
1960: 61 6d 65 21 3d 24 74 62 6c 6e 61 6d 65 7d 5d 0a  ame!=$tblname}].
1970: 20 20 73 65 74 20 69 73 5f 77 69 74 68 6f 75 74    set is_without
1980: 5f 72 6f 77 69 64 20 5b 69 73 5f 77 69 74 68 6f  _rowid [is_witho
1990: 75 74 5f 72 6f 77 69 64 20 24 6e 61 6d 65 5d 0a  ut_rowid $name].
19a0: 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20    db eval {.    
19b0: 53 45 4c 45 43 54 20 0a 20 20 20 20 20 20 73 75  SELECT .      su
19c0: 6d 28 6e 63 65 6c 6c 29 20 41 53 20 6e 65 6e 74  m(ncell) AS nent
19d0: 72 79 2c 0a 20 20 20 20 20 20 73 75 6d 28 28 70  ry,.      sum((p
19e0: 61 67 65 74 79 70 65 3d 3d 27 6c 65 61 66 27 29  agetype=='leaf')
19f0: 2a 6e 63 65 6c 6c 29 20 41 53 20 6c 65 61 66 5f  *ncell) AS leaf_
1a00: 65 6e 74 72 69 65 73 2c 0a 20 20 20 20 20 20 73  entries,.      s
1a10: 75 6d 28 70 61 79 6c 6f 61 64 29 20 41 53 20 70  um(payload) AS p
1a20: 61 79 6c 6f 61 64 2c 0a 20 20 20 20 20 20 73 75  ayload,.      su
1a30: 6d 28 28 70 61 67 65 74 79 70 65 3d 3d 27 6f 76  m((pagetype=='ov
1a40: 65 72 66 6c 6f 77 27 29 20 2a 20 70 61 79 6c 6f  erflow') * paylo
1a50: 61 64 29 20 41 53 20 6f 76 66 6c 5f 70 61 79 6c  ad) AS ovfl_payl
1a60: 6f 61 64 2c 0a 20 20 20 20 20 20 73 75 6d 28 70  oad,.      sum(p
1a70: 61 74 68 20 4c 49 4b 45 20 27 25 2b 30 30 30 30  ath LIKE '%+0000
1a80: 30 30 27 29 20 41 53 20 6f 76 66 6c 5f 63 6e 74  00') AS ovfl_cnt
1a90: 2c 0a 20 20 20 20 20 20 6d 61 78 28 6d 78 5f 70  ,.      max(mx_p
1aa0: 61 79 6c 6f 61 64 29 20 41 53 20 6d 78 5f 70 61  ayload) AS mx_pa
1ab0: 79 6c 6f 61 64 2c 0a 20 20 20 20 20 20 73 75 6d  yload,.      sum
1ac0: 28 70 61 67 65 74 79 70 65 3d 3d 27 69 6e 74 65  (pagetype=='inte
1ad0: 72 6e 61 6c 27 29 20 41 53 20 69 6e 74 5f 70 61  rnal') AS int_pa
1ae0: 67 65 73 2c 0a 20 20 20 20 20 20 73 75 6d 28 70  ges,.      sum(p
1af0: 61 67 65 74 79 70 65 3d 3d 27 6c 65 61 66 27 29  agetype=='leaf')
1b00: 20 41 53 20 6c 65 61 66 5f 70 61 67 65 73 2c 0a   AS leaf_pages,.
1b10: 20 20 20 20 20 20 73 75 6d 28 70 61 67 65 74 79        sum(pagety
1b20: 70 65 3d 3d 27 6f 76 65 72 66 6c 6f 77 27 29 20  pe=='overflow') 
1b30: 41 53 20 6f 76 66 6c 5f 70 61 67 65 73 2c 0a 20  AS ovfl_pages,. 
1b40: 20 20 20 20 20 73 75 6d 28 28 70 61 67 65 74 79       sum((pagety
1b50: 70 65 3d 3d 27 69 6e 74 65 72 6e 61 6c 27 29 20  pe=='internal') 
1b60: 2a 20 75 6e 75 73 65 64 29 20 41 53 20 69 6e 74  * unused) AS int
1b70: 5f 75 6e 75 73 65 64 2c 0a 20 20 20 20 20 20 73  _unused,.      s
1b80: 75 6d 28 28 70 61 67 65 74 79 70 65 3d 3d 27 6c  um((pagetype=='l
1b90: 65 61 66 27 29 20 2a 20 75 6e 75 73 65 64 29 20  eaf') * unused) 
1ba0: 41 53 20 6c 65 61 66 5f 75 6e 75 73 65 64 2c 0a  AS leaf_unused,.
1bb0: 20 20 20 20 20 20 73 75 6d 28 28 70 61 67 65 74        sum((paget
1bc0: 79 70 65 3d 3d 27 6f 76 65 72 66 6c 6f 77 27 29  ype=='overflow')
1bd0: 20 2a 20 75 6e 75 73 65 64 29 20 41 53 20 6f 76   * unused) AS ov
1be0: 66 6c 5f 75 6e 75 73 65 64 2c 0a 20 20 20 20 20  fl_unused,.     
1bf0: 20 73 75 6d 28 70 67 73 69 7a 65 29 20 41 53 20   sum(pgsize) AS 
1c00: 63 6f 6d 70 72 65 73 73 65 64 5f 73 69 7a 65 2c  compressed_size,
1c10: 0a 20 20 20 20 20 20 6d 61 78 28 28 6c 65 6e 67  .      max((leng
1c20: 74 68 28 43 41 53 45 20 57 48 45 4e 20 70 61 74  th(CASE WHEN pat
1c30: 68 20 4c 49 4b 45 20 27 25 2b 25 27 20 54 48 45  h LIKE '%+%' THE
1c40: 4e 20 27 27 20 45 4c 53 45 20 70 61 74 68 20 45  N '' ELSE path E
1c50: 4e 44 29 2b 33 29 2f 34 29 0a 20 20 20 20 20 20  ND)+3)/4).      
1c60: 20 20 41 53 20 64 65 70 74 68 0a 20 20 20 20 46    AS depth.    F
1c70: 52 4f 4d 20 74 65 6d 70 2e 64 62 73 74 61 74 20  ROM temp.dbstat 
1c80: 57 48 45 52 45 20 6e 61 6d 65 20 3d 20 24 6e 61  WHERE name = $na
1c90: 6d 65 0a 20 20 7d 20 62 72 65 61 6b 0a 0a 20 20  me.  } break..  
1ca0: 73 65 74 20 74 6f 74 61 6c 5f 70 61 67 65 73 20  set total_pages 
1cb0: 5b 65 78 70 72 20 7b 24 6c 65 61 66 5f 70 61 67  [expr {$leaf_pag
1cc0: 65 73 2b 24 69 6e 74 5f 70 61 67 65 73 2b 24 6f  es+$int_pages+$o
1cd0: 76 66 6c 5f 70 61 67 65 73 7d 5d 0a 20 20 73 65  vfl_pages}].  se
1ce0: 74 20 73 74 6f 72 61 67 65 20 5b 65 78 70 72 20  t storage [expr 
1cf0: 7b 24 74 6f 74 61 6c 5f 70 61 67 65 73 2a 24 70  {$total_pages*$p
1d00: 61 67 65 53 69 7a 65 7d 5d 0a 20 20 69 66 20 7b  ageSize}].  if {
1d10: 21 24 69 73 43 6f 6d 70 72 65 73 73 65 64 20 26  !$isCompressed &
1d20: 26 20 24 73 74 6f 72 61 67 65 3e 24 63 6f 6d 70  & $storage>$comp
1d30: 72 65 73 73 65 64 5f 73 69 7a 65 7d 20 7b 0a 20  ressed_size} {. 
1d40: 20 20 20 73 65 74 20 69 73 43 6f 6d 70 72 65 73     set isCompres
1d50: 73 65 64 20 31 0a 20 20 20 20 73 65 74 20 63 6f  sed 1.    set co
1d60: 6d 70 72 65 73 73 4f 76 65 72 68 65 61 64 20 31  mpressOverhead 1
1d70: 34 0a 20 20 7d 0a 0a 20 20 23 20 43 6f 6c 75 6d  4.  }..  # Colum
1d80: 6e 20 27 67 61 70 5f 63 6e 74 27 20 69 73 20 73  n 'gap_cnt' is s
1d90: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
1da0: 20 6f 66 20 6e 6f 6e 2d 63 6f 6e 74 69 67 75 6f   of non-contiguo
1db0: 75 73 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  us entries in th
1dc0: 65 0a 20 20 23 20 6c 69 73 74 20 6f 66 20 70 61  e.  # list of pa
1dd0: 67 65 73 20 76 69 73 69 74 65 64 20 69 66 20 74  ges visited if t
1de0: 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  he b-tree struct
1df0: 75 72 65 20 69 73 20 74 72 61 76 65 72 73 65 64  ure is traversed
1e00: 20 69 6e 20 61 20 74 6f 70 2d 64 6f 77 6e 0a 20   in a top-down. 
1e10: 20 23 20 66 61 73 68 69 6f 6e 20 28 65 61 63 68   # fashion (each
1e20: 20 6e 6f 64 65 20 76 69 73 69 74 65 64 20 62 65   node visited be
1e30: 66 6f 72 65 20 69 74 73 20 63 68 69 6c 64 2d 74  fore its child-t
1e40: 72 65 65 20 69 73 20 70 61 73 73 65 64 29 2e 20  ree is passed). 
1e50: 41 6e 79 20 6f 76 65 72 66 6c 6f 77 0a 20 20 23  Any overflow.  #
1e60: 20 63 68 61 69 6e 73 20 70 72 65 73 65 6e 74 20   chains present 
1e70: 61 72 65 20 74 72 61 76 65 72 73 65 64 20 66 72  are traversed fr
1e80: 6f 6d 20 73 74 61 72 74 20 74 6f 20 66 69 6e 69  om start to fini
1e90: 73 68 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68  sh before any ch
1ea0: 69 6c 64 2d 74 72 65 65 0a 20 20 23 20 69 73 2e  ild-tree.  # is.
1eb0: 0a 20 20 23 0a 20 20 73 65 74 20 67 61 70 5f 63  .  #.  set gap_c
1ec0: 6e 74 20 30 0a 20 20 73 65 74 20 70 72 65 76 20  nt 0.  set prev 
1ed0: 30 0a 20 20 64 62 20 65 76 61 6c 20 7b 0a 20 20  0.  db eval {.  
1ee0: 20 20 53 45 4c 45 43 54 20 70 61 67 65 6e 6f 2c    SELECT pageno,
1ef0: 20 70 61 67 65 74 79 70 65 20 46 52 4f 4d 20 74   pagetype FROM t
1f00: 65 6d 70 2e 64 62 73 74 61 74 0a 20 20 20 20 20  emp.dbstat.     
1f10: 57 48 45 52 45 20 6e 61 6d 65 3d 24 6e 61 6d 65  WHERE name=$name
1f20: 0a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 70  .     ORDER BY p
1f30: 61 67 65 6e 6f 0a 20 20 7d 20 7b 0a 20 20 20 20  ageno.  } {.    
1f40: 69 66 20 7b 24 70 72 65 76 3e 30 20 26 26 20 24  if {$prev>0 && $
1f50: 70 61 67 65 74 79 70 65 3d 3d 22 6c 65 61 66 22  pagetype=="leaf"
1f60: 20 26 26 20 24 70 61 67 65 6e 6f 21 3d 24 70 72   && $pageno!=$pr
1f70: 65 76 2b 31 7d 20 7b 0a 20 20 20 20 20 20 69 6e  ev+1} {.      in
1f80: 63 72 20 67 61 70 5f 63 6e 74 0a 20 20 20 20 7d  cr gap_cnt.    }
1f90: 0a 20 20 20 20 73 65 74 20 70 72 65 76 20 24 70  .    set prev $p
1fa0: 61 67 65 6e 6f 0a 20 20 7d 0a 20 20 6d 65 6d 20  ageno.  }.  mem 
1fb0: 65 76 61 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  eval {.    INSER
1fc0: 54 20 49 4e 54 4f 20 73 70 61 63 65 5f 75 73 65  T INTO space_use
1fd0: 64 20 56 41 4c 55 45 53 28 0a 20 20 20 20 20 20  d VALUES(.      
1fe0: 24 6e 61 6d 65 2c 0a 20 20 20 20 20 20 24 74 62  $name,.      $tb
1ff0: 6c 6e 61 6d 65 2c 0a 20 20 20 20 20 20 24 69 73  lname,.      $is
2000: 5f 69 6e 64 65 78 2c 0a 20 20 20 20 20 20 24 69  _index,.      $i
2010: 73 5f 77 69 74 68 6f 75 74 5f 72 6f 77 69 64 2c  s_without_rowid,
2020: 0a 20 20 20 20 20 20 24 6e 65 6e 74 72 79 2c 0a  .      $nentry,.
2030: 20 20 20 20 20 20 24 6c 65 61 66 5f 65 6e 74 72        $leaf_entr
2040: 69 65 73 2c 0a 20 20 20 20 20 20 24 64 65 70 74  ies,.      $dept
2050: 68 2c 0a 20 20 20 20 20 20 24 70 61 79 6c 6f 61  h,.      $payloa
2060: 64 2c 20 20 20 20 20 0a 20 20 20 20 20 20 24 6f  d,     .      $o
2070: 76 66 6c 5f 70 61 79 6c 6f 61 64 2c 0a 20 20 20  vfl_payload,.   
2080: 20 20 20 24 6f 76 66 6c 5f 63 6e 74 2c 20 20 20     $ovfl_cnt,   
2090: 0a 20 20 20 20 20 20 24 6d 78 5f 70 61 79 6c 6f  .      $mx_paylo
20a0: 61 64 2c 0a 20 20 20 20 20 20 24 69 6e 74 5f 70  ad,.      $int_p
20b0: 61 67 65 73 2c 0a 20 20 20 20 20 20 24 6c 65 61  ages,.      $lea
20c0: 66 5f 70 61 67 65 73 2c 20 20 0a 20 20 20 20 20  f_pages,  .     
20d0: 20 24 6f 76 66 6c 5f 70 61 67 65 73 2c 20 0a 20   $ovfl_pages, . 
20e0: 20 20 20 20 20 24 69 6e 74 5f 75 6e 75 73 65 64       $int_unused
20f0: 2c 20 0a 20 20 20 20 20 20 24 6c 65 61 66 5f 75  , .      $leaf_u
2100: 6e 75 73 65 64 2c 0a 20 20 20 20 20 20 24 6f 76  nused,.      $ov
2110: 66 6c 5f 75 6e 75 73 65 64 2c 0a 20 20 20 20 20  fl_unused,.     
2120: 20 24 67 61 70 5f 63 6e 74 2c 0a 20 20 20 20 20   $gap_cnt,.     
2130: 20 24 63 6f 6d 70 72 65 73 73 65 64 5f 73 69 7a   $compressed_siz
2140: 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  e.    );.  }.}..
2150: 70 72 6f 63 20 69 6e 74 65 67 65 72 69 66 79 20  proc integerify 
2160: 7b 72 65 61 6c 7d 20 7b 0a 20 20 69 66 20 7b 5b  {real} {.  if {[
2170: 73 74 72 69 6e 67 20 69 73 20 64 6f 75 62 6c 65  string is double
2180: 20 2d 73 74 72 69 63 74 20 24 72 65 61 6c 5d 7d   -strict $real]}
2190: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 65   {.    return [e
21a0: 78 70 72 20 7b 77 69 64 65 28 24 72 65 61 6c 29  xpr {wide($real)
21b0: 7d 5d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  }].  } else {.  
21c0: 20 20 72 65 74 75 72 6e 20 30 0a 20 20 7d 0a 7d    return 0.  }.}
21d0: 0a 6d 65 6d 20 66 75 6e 63 74 69 6f 6e 20 69 6e  .mem function in
21e0: 74 20 69 6e 74 65 67 65 72 69 66 79 0a 0a 23 20  t integerify..# 
21f0: 51 75 6f 74 65 20 61 20 73 74 72 69 6e 67 20 66  Quote a string f
2200: 6f 72 20 75 73 65 20 69 6e 20 61 6e 20 53 51 4c  or use in an SQL
2210: 20 71 75 65 72 79 2e 20 45 78 61 6d 70 6c 65 73   query. Examples
2220: 3a 0a 23 0a 23 20 5b 71 75 6f 74 65 20 7b 68 65  :.#.# [quote {he
2230: 6c 6c 6f 20 77 6f 72 6c 64 7d 5d 20 20 20 3d 3d  llo world}]   ==
2240: 20 7b 27 68 65 6c 6c 6f 20 77 6f 72 6c 64 27 7d   {'hello world'}
2250: 0a 23 20 5b 71 75 6f 74 65 20 7b 68 65 6c 6c 6f  .# [quote {hello
2260: 20 77 6f 72 6c 64 27 73 7d 5d 20 3d 3d 20 7b 27   world's}] == {'
2270: 68 65 6c 6c 6f 20 77 6f 72 6c 64 27 27 73 27 7d  hello world''s'}
2280: 0a 23 0a 70 72 6f 63 20 71 75 6f 74 65 20 7b 74  .#.proc quote {t
2290: 78 74 7d 20 7b 0a 20 20 72 65 74 75 72 6e 20 5b  xt} {.  return [
22a0: 73 74 72 69 6e 67 20 6d 61 70 20 7b 27 20 27 27  string map {' ''
22b0: 7d 20 24 74 78 74 5d 0a 7d 0a 0a 23 20 4f 75 74  } $txt].}..# Out
22c0: 70 75 74 20 61 20 74 69 74 6c 65 20 6c 69 6e 65  put a title line
22d0: 0a 23 0a 70 72 6f 63 20 74 69 74 6c 65 6c 69 6e  .#.proc titlelin
22e0: 65 20 7b 74 69 74 6c 65 7d 20 7b 0a 20 20 69 66  e {title} {.  if
22f0: 20 7b 24 74 69 74 6c 65 3d 3d 22 22 7d 20 7b 0a   {$title==""} {.
2300: 20 20 20 20 70 75 74 73 20 5b 73 74 72 69 6e 67      puts [string
2310: 20 72 65 70 65 61 74 20 2a 20 37 39 5d 0a 20 20   repeat * 79].  
2320: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73 65 74  } else {.    set
2330: 20 6c 65 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e   len [string len
2340: 67 74 68 20 24 74 69 74 6c 65 5d 0a 20 20 20 20  gth $title].    
2350: 73 65 74 20 73 74 61 72 73 20 5b 73 74 72 69 6e  set stars [strin
2360: 67 20 72 65 70 65 61 74 20 2a 20 5b 65 78 70 72  g repeat * [expr
2370: 20 37 39 2d 24 6c 65 6e 2d 35 5d 5d 0a 20 20 20   79-$len-5]].   
2380: 20 70 75 74 73 20 22 2a 2a 2a 20 24 74 69 74 6c   puts "*** $titl
2390: 65 20 24 73 74 61 72 73 22 0a 20 20 7d 0a 7d 0a  e $stars".  }.}.
23a0: 0a 23 20 47 65 6e 65 72 61 74 65 20 61 20 73 69  .# Generate a si
23b0: 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 6f 75 74  ngle line of out
23c0: 70 75 74 20 69 6e 20 74 68 65 20 73 74 61 74 69  put in the stati
23d0: 73 74 69 63 73 20 73 65 63 74 69 6f 6e 20 6f 66  stics section of
23e0: 20 74 68 65 0a 23 20 72 65 70 6f 72 74 2e 0a 23   the.# report..#
23f0: 0a 70 72 6f 63 20 73 74 61 74 6c 69 6e 65 20 7b  .proc statline {
2400: 74 69 74 6c 65 20 76 61 6c 75 65 20 7b 65 78 74  title value {ext
2410: 72 61 20 7b 7d 7d 7d 20 7b 0a 20 20 73 65 74 20  ra {}}} {.  set 
2420: 6c 65 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67  len [string leng
2430: 74 68 20 24 74 69 74 6c 65 5d 0a 20 20 73 65 74  th $title].  set
2440: 20 64 6f 74 73 20 5b 73 74 72 69 6e 67 20 72 65   dots [string re
2450: 70 65 61 74 20 2e 20 5b 65 78 70 72 20 35 30 2d  peat . [expr 50-
2460: 24 6c 65 6e 5d 5d 0a 20 20 73 65 74 20 6c 65 6e  $len]].  set len
2470: 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20   [string length 
2480: 24 76 61 6c 75 65 5d 0a 20 20 73 65 74 20 73 70  $value].  set sp
2490: 32 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20  2 [string range 
24a0: 7b 20 20 20 20 20 20 20 20 20 20 7d 20 24 6c 65  {          } $le
24b0: 6e 20 65 6e 64 5d 0a 20 20 69 66 20 7b 24 65 78  n end].  if {$ex
24c0: 74 72 61 20 6e 65 20 22 22 7d 20 7b 0a 20 20 20  tra ne ""} {.   
24d0: 20 73 65 74 20 65 78 74 72 61 20 22 20 24 65 78   set extra " $ex
24e0: 74 72 61 22 0a 20 20 7d 0a 20 20 70 75 74 73 20  tra".  }.  puts 
24f0: 22 24 74 69 74 6c 65 24 64 6f 74 73 20 24 76 61  "$title$dots $va
2500: 6c 75 65 24 73 70 32 24 65 78 74 72 61 22 0a 7d  lue$sp2$extra".}
2510: 0a 0a 23 20 47 65 6e 65 72 61 74 65 20 61 20 66  ..# Generate a f
2520: 6f 72 6d 61 74 74 65 64 20 70 65 72 63 65 6e 74  ormatted percent
2530: 61 67 65 20 76 61 6c 75 65 20 66 6f 72 20 24 6e  age value for $n
2540: 75 6d 2f 24 64 65 6e 6f 6d 0a 23 0a 70 72 6f 63  um/$denom.#.proc
2550: 20 70 65 72 63 65 6e 74 20 7b 6e 75 6d 20 64 65   percent {num de
2560: 6e 6f 6d 20 7b 6f 66 20 7b 7d 7d 7d 20 7b 0a 20  nom {of {}}} {. 
2570: 20 69 66 20 7b 24 64 65 6e 6f 6d 3d 3d 30 2e 30   if {$denom==0.0
2580: 7d 20 7b 72 65 74 75 72 6e 20 22 22 7d 0a 20 20  } {return ""}.  
2590: 73 65 74 20 76 20 5b 65 78 70 72 20 7b 24 6e 75  set v [expr {$nu
25a0: 6d 2a 31 30 30 2e 30 2f 24 64 65 6e 6f 6d 7d 5d  m*100.0/$denom}]
25b0: 0a 20 20 73 65 74 20 6f 66 20 7b 7d 0a 20 20 69  .  set of {}.  i
25c0: 66 20 7b 24 76 3d 3d 31 30 30 2e 30 20 7c 7c 20  f {$v==100.0 || 
25d0: 24 76 3c 30 2e 30 30 31 20 7c 7c 20 28 24 76 3e  $v<0.001 || ($v>
25e0: 31 2e 30 20 26 26 20 24 76 3c 39 39 2e 30 29 7d  1.0 && $v<99.0)}
25f0: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 66   {.    return [f
2600: 6f 72 6d 61 74 20 7b 25 35 2e 31 66 25 25 20 25  ormat {%5.1f%% %
2610: 73 7d 20 24 76 20 24 6f 66 5d 0a 20 20 7d 20 65  s} $v $of].  } e
2620: 6c 73 65 69 66 20 7b 24 76 3c 30 2e 31 20 7c 7c  lseif {$v<0.1 ||
2630: 20 24 76 3e 39 39 2e 39 7d 20 7b 0a 20 20 20 20   $v>99.9} {.    
2640: 72 65 74 75 72 6e 20 5b 66 6f 72 6d 61 74 20 7b  return [format {
2650: 25 37 2e 33 66 25 25 20 25 73 7d 20 24 76 20 24  %7.3f%% %s} $v $
2660: 6f 66 5d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  of].  } else {. 
2670: 20 20 20 72 65 74 75 72 6e 20 5b 66 6f 72 6d 61     return [forma
2680: 74 20 7b 25 36 2e 32 66 25 25 20 25 73 7d 20 24  t {%6.2f%% %s} $
2690: 76 20 24 6f 66 5d 0a 20 20 7d 0a 7d 0a 0a 70 72  v $of].  }.}..pr
26a0: 6f 63 20 64 69 76 69 64 65 20 7b 6e 75 6d 20 64  oc divide {num d
26b0: 65 6e 6f 6d 7d 20 7b 0a 20 20 69 66 20 7b 24 64  enom} {.  if {$d
26c0: 65 6e 6f 6d 3d 3d 30 7d 20 7b 72 65 74 75 72 6e  enom==0} {return
26d0: 20 30 2e 30 7d 0a 20 20 72 65 74 75 72 6e 20 5b   0.0}.  return [
26e0: 66 6f 72 6d 61 74 20 25 2e 32 66 20 5b 65 78 70  format %.2f [exp
26f0: 72 20 64 6f 75 62 6c 65 28 24 6e 75 6d 29 2f 64  r double($num)/d
2700: 6f 75 62 6c 65 28 24 64 65 6e 6f 6d 29 5d 5d 0a  ouble($denom)]].
2710: 7d 0a 0a 23 20 47 65 6e 65 72 61 74 65 20 61 20  }..# Generate a 
2720: 73 75 62 72 65 70 6f 72 74 20 74 68 61 74 20 63  subreport that c
2730: 6f 76 65 72 73 20 73 6f 6d 65 20 73 75 62 73 65  overs some subse
2740: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
2750: 65 2e 0a 23 20 74 68 65 20 24 77 68 65 72 65 20  e..# the $where 
2760: 63 6c 61 75 73 65 20 64 65 74 65 72 6d 69 6e 65  clause determine
2770: 73 20 77 68 69 63 68 20 73 75 62 73 65 74 20 74  s which subset t
2780: 6f 20 61 6e 61 6c 79 7a 65 2e 0a 23 0a 70 72 6f  o analyze..#.pro
2790: 63 20 73 75 62 72 65 70 6f 72 74 20 7b 74 69 74  c subreport {tit
27a0: 6c 65 20 77 68 65 72 65 20 73 68 6f 77 46 72 61  le where showFra
27b0: 67 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 70 61  g} {.  global pa
27c0: 67 65 53 69 7a 65 20 66 69 6c 65 5f 70 67 63 6e  geSize file_pgcn
27d0: 74 20 63 6f 6d 70 72 65 73 73 4f 76 65 72 68 65  t compressOverhe
27e0: 61 64 0a 0a 20 20 23 20 51 75 65 72 79 20 74 68  ad..  # Query th
27f0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  e in-memory data
2800: 62 61 73 65 20 66 6f 72 20 74 68 65 20 73 75 6d  base for the sum
2810: 20 6f 66 20 76 61 72 69 6f 75 73 20 73 74 61 74   of various stat
2820: 69 73 74 69 63 73 20 0a 20 20 23 20 66 6f 72 20  istics .  # for 
2830: 74 68 65 20 73 75 62 73 65 74 20 6f 66 20 74 61  the subset of ta
2840: 62 6c 65 73 2f 69 6e 64 69 63 65 73 20 69 64 65  bles/indices ide
2850: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57  ntified by the W
2860: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 0a 20  HERE clause in. 
2870: 20 23 20 24 77 68 65 72 65 2e 20 4e 6f 74 65 20   # $where. Note 
2880: 74 68 61 74 20 65 76 65 6e 20 69 66 20 74 68 65  that even if the
2890: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61   WHERE clause ma
28a0: 74 63 68 65 73 20 6e 6f 20 72 6f 77 73 2c 20 74  tches no rows, t
28b0: 68 65 0a 20 20 23 20 66 6f 6c 6c 6f 77 69 6e 67  he.  # following
28c0: 20 71 75 65 72 79 20 72 65 74 75 72 6e 73 20 65   query returns e
28d0: 78 61 63 74 6c 79 20 6f 6e 65 20 72 6f 77 20 28  xactly one row (
28e0: 62 65 63 61 75 73 65 20 69 74 20 69 73 20 61 6e  because it is an
28f0: 20 61 67 67 72 65 67 61 74 65 29 2e 0a 20 20 23   aggregate)..  #
2900: 0a 20 20 23 20 54 68 65 20 72 65 73 75 6c 74 73  .  # The results
2910: 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 61 72   of the query ar
2920: 65 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  e stored directl
2930: 79 20 62 79 20 53 51 4c 69 74 65 20 69 6e 74 6f  y by SQLite into
2940: 20 6c 6f 63 61 6c 20 0a 20 20 23 20 76 61 72 69   local .  # vari
2950: 61 62 6c 65 73 20 28 69 2e 65 2e 20 24 6e 65 6e  ables (i.e. $nen
2960: 74 72 79 2c 20 24 70 61 79 6c 6f 61 64 20 65 74  try, $payload et
2970: 63 2e 29 2e 0a 20 20 23 0a 20 20 6d 65 6d 20 65  c.)..  #.  mem e
2980: 76 61 6c 20 22 0a 20 20 20 20 53 45 4c 45 43 54  val ".    SELECT
2990: 0a 20 20 20 20 20 20 69 6e 74 28 73 75 6d 28 0a  .      int(sum(.
29a0: 20 20 20 20 20 20 20 20 43 41 53 45 20 57 48 45          CASE WHE
29b0: 4e 20 28 69 73 5f 77 69 74 68 6f 75 74 5f 72 6f  N (is_without_ro
29c0: 77 69 64 20 4f 52 20 69 73 5f 69 6e 64 65 78 29  wid OR is_index)
29d0: 20 54 48 45 4e 20 6e 65 6e 74 72 79 20 0a 20 20   THEN nentry .  
29e0: 20 20 20 20 20 20 20 20 20 20 20 45 4c 53 45 20             ELSE 
29f0: 6c 65 61 66 5f 65 6e 74 72 69 65 73 20 0a 20 20  leaf_entries .  
2a00: 20 20 20 20 20 20 45 4e 44 0a 20 20 20 20 20 20        END.      
2a10: 29 29 20 41 53 20 6e 65 6e 74 72 79 2c 0a 20 20  )) AS nentry,.  
2a20: 20 20 20 20 69 6e 74 28 73 75 6d 28 70 61 79 6c      int(sum(payl
2a30: 6f 61 64 29 29 20 41 53 20 70 61 79 6c 6f 61 64  oad)) AS payload
2a40: 2c 0a 20 20 20 20 20 20 69 6e 74 28 73 75 6d 28  ,.      int(sum(
2a50: 6f 76 66 6c 5f 70 61 79 6c 6f 61 64 29 29 20 41  ovfl_payload)) A
2a60: 53 20 6f 76 66 6c 5f 70 61 79 6c 6f 61 64 2c 0a  S ovfl_payload,.
2a70: 20 20 20 20 20 20 6d 61 78 28 6d 78 5f 70 61 79        max(mx_pay
2a80: 6c 6f 61 64 29 20 41 53 20 6d 78 5f 70 61 79 6c  load) AS mx_payl
2a90: 6f 61 64 2c 0a 20 20 20 20 20 20 69 6e 74 28 73  oad,.      int(s
2aa0: 75 6d 28 6f 76 66 6c 5f 63 6e 74 29 29 20 61 73  um(ovfl_cnt)) as
2ab0: 20 6f 76 66 6c 5f 63 6e 74 2c 0a 20 20 20 20 20   ovfl_cnt,.     
2ac0: 20 69 6e 74 28 73 75 6d 28 6c 65 61 66 5f 70 61   int(sum(leaf_pa
2ad0: 67 65 73 29 29 20 41 53 20 6c 65 61 66 5f 70 61  ges)) AS leaf_pa
2ae0: 67 65 73 2c 0a 20 20 20 20 20 20 69 6e 74 28 73  ges,.      int(s
2af0: 75 6d 28 69 6e 74 5f 70 61 67 65 73 29 29 20 41  um(int_pages)) A
2b00: 53 20 69 6e 74 5f 70 61 67 65 73 2c 0a 20 20 20  S int_pages,.   
2b10: 20 20 20 69 6e 74 28 73 75 6d 28 6f 76 66 6c 5f     int(sum(ovfl_
2b20: 70 61 67 65 73 29 29 20 41 53 20 6f 76 66 6c 5f  pages)) AS ovfl_
2b30: 70 61 67 65 73 2c 0a 20 20 20 20 20 20 69 6e 74  pages,.      int
2b40: 28 73 75 6d 28 6c 65 61 66 5f 75 6e 75 73 65 64  (sum(leaf_unused
2b50: 29 29 20 41 53 20 6c 65 61 66 5f 75 6e 75 73 65  )) AS leaf_unuse
2b60: 64 2c 0a 20 20 20 20 20 20 69 6e 74 28 73 75 6d  d,.      int(sum
2b70: 28 69 6e 74 5f 75 6e 75 73 65 64 29 29 20 41 53  (int_unused)) AS
2b80: 20 69 6e 74 5f 75 6e 75 73 65 64 2c 0a 20 20 20   int_unused,.   
2b90: 20 20 20 69 6e 74 28 73 75 6d 28 6f 76 66 6c 5f     int(sum(ovfl_
2ba0: 75 6e 75 73 65 64 29 29 20 41 53 20 6f 76 66 6c  unused)) AS ovfl
2bb0: 5f 75 6e 75 73 65 64 2c 0a 20 20 20 20 20 20 69  _unused,.      i
2bc0: 6e 74 28 73 75 6d 28 67 61 70 5f 63 6e 74 29 29  nt(sum(gap_cnt))
2bd0: 20 41 53 20 67 61 70 5f 63 6e 74 2c 0a 20 20 20   AS gap_cnt,.   
2be0: 20 20 20 69 6e 74 28 73 75 6d 28 63 6f 6d 70 72     int(sum(compr
2bf0: 65 73 73 65 64 5f 73 69 7a 65 29 29 20 41 53 20  essed_size)) AS 
2c00: 63 6f 6d 70 72 65 73 73 65 64 5f 73 69 7a 65 2c  compressed_size,
2c10: 0a 20 20 20 20 20 20 69 6e 74 28 6d 61 78 28 64  .      int(max(d
2c20: 65 70 74 68 29 29 20 41 53 20 64 65 70 74 68 2c  epth)) AS depth,
2c30: 0a 20 20 20 20 20 20 63 6f 75 6e 74 28 2a 29 20  .      count(*) 
2c40: 41 53 20 63 6e 74 0a 20 20 20 20 46 52 4f 4d 20  AS cnt.    FROM 
2c50: 73 70 61 63 65 5f 75 73 65 64 20 57 48 45 52 45  space_used WHERE
2c60: 20 24 77 68 65 72 65 22 20 7b 7d 20 7b 7d 0a 0a   $where" {} {}..
2c70: 20 20 23 20 4f 75 74 70 75 74 20 74 68 65 20 73    # Output the s
2c80: 75 62 2d 72 65 70 6f 72 74 20 74 69 74 6c 65 2c  ub-report title,
2c90: 20 6e 69 63 65 6c 79 20 64 65 63 6f 72 61 74 65   nicely decorate
2ca0: 64 20 77 69 74 68 20 2a 20 63 68 61 72 61 63 74  d with * charact
2cb0: 65 72 73 2e 0a 20 20 23 0a 20 20 70 75 74 73 20  ers..  #.  puts 
2cc0: 22 22 0a 20 20 74 69 74 6c 65 6c 69 6e 65 20 24  "".  titleline $
2cd0: 74 69 74 6c 65 0a 20 20 70 75 74 73 20 22 22 0a  title.  puts "".
2ce0: 0a 20 20 23 20 43 61 6c 63 75 6c 61 74 65 20 73  .  # Calculate s
2cf0: 74 61 74 69 73 74 69 63 73 20 61 6e 64 20 73 74  tatistics and st
2d00: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
2d10: 69 6e 20 54 43 4c 20 76 61 72 69 61 62 6c 65 73  in TCL variables
2d20: 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  , as follows:.  
2d30: 23 0a 20 20 23 20 74 6f 74 61 6c 5f 70 61 67 65  #.  # total_page
2d40: 73 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  s: Database page
2d50: 73 20 63 6f 6e 73 75 6d 65 64 2e 0a 20 20 23 20  s consumed..  # 
2d60: 74 6f 74 61 6c 5f 70 61 67 65 73 5f 70 65 72 63  total_pages_perc
2d70: 65 6e 74 3a 20 50 61 67 65 73 20 63 6f 6e 73 75  ent: Pages consu
2d80: 6d 65 64 20 61 73 20 61 20 70 65 72 63 65 6e 74  med as a percent
2d90: 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  age of the file.
2da0: 0a 20 20 23 20 73 74 6f 72 61 67 65 3a 20 42 79  .  # storage: By
2db0: 74 65 73 20 63 6f 6e 73 75 6d 65 64 2e 0a 20 20  tes consumed..  
2dc0: 23 20 70 61 79 6c 6f 61 64 5f 70 65 72 63 65 6e  # payload_percen
2dd0: 74 3a 20 50 61 79 6c 6f 61 64 20 62 79 74 65 73  t: Payload bytes
2de0: 20 75 73 65 64 20 61 73 20 61 20 70 65 72 63 65   used as a perce
2df0: 6e 74 61 67 65 20 6f 66 20 24 73 74 6f 72 61 67  ntage of $storag
2e00: 65 2e 0a 20 20 23 20 74 6f 74 61 6c 5f 75 6e 75  e..  # total_unu
2e10: 73 65 64 3a 20 55 6e 75 73 65 64 20 62 79 74 65  sed: Unused byte
2e20: 73 20 6f 6e 20 70 61 67 65 73 2e 0a 20 20 23 20  s on pages..  # 
2e30: 61 76 67 5f 70 61 79 6c 6f 61 64 3a 20 41 76 65  avg_payload: Ave
2e40: 72 61 67 65 20 70 61 79 6c 6f 61 64 20 70 65 72  rage payload per
2e50: 20 62 74 72 65 65 20 65 6e 74 72 79 2e 0a 20 20   btree entry..  
2e60: 23 20 61 76 67 5f 66 61 6e 6f 75 74 3a 20 41 76  # avg_fanout: Av
2e70: 65 72 61 67 65 20 66 61 6e 6f 75 74 20 66 6f 72  erage fanout for
2e80: 20 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 73 2e   internal pages.
2e90: 0a 20 20 23 20 61 76 67 5f 75 6e 75 73 65 64 3a  .  # avg_unused:
2ea0: 20 41 76 65 72 61 67 65 20 75 6e 75 73 65 64 20   Average unused 
2eb0: 62 79 74 65 73 20 70 65 72 20 62 74 72 65 65 20  bytes per btree 
2ec0: 65 6e 74 72 79 2e 0a 20 20 23 20 6f 76 66 6c 5f  entry..  # ovfl_
2ed0: 63 6e 74 5f 70 65 72 63 65 6e 74 3a 20 50 65 72  cnt_percent: Per
2ee0: 63 65 6e 74 61 67 65 20 6f 66 20 62 74 72 65 65  centage of btree
2ef0: 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 75 73   entries that us
2f00: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
2f10: 2e 0a 20 20 23 0a 20 20 73 65 74 20 74 6f 74 61  ..  #.  set tota
2f20: 6c 5f 70 61 67 65 73 20 5b 65 78 70 72 20 7b 24  l_pages [expr {$
2f30: 6c 65 61 66 5f 70 61 67 65 73 2b 24 69 6e 74 5f  leaf_pages+$int_
2f40: 70 61 67 65 73 2b 24 6f 76 66 6c 5f 70 61 67 65  pages+$ovfl_page
2f50: 73 7d 5d 0a 20 20 73 65 74 20 74 6f 74 61 6c 5f  s}].  set total_
2f60: 70 61 67 65 73 5f 70 65 72 63 65 6e 74 20 5b 70  pages_percent [p
2f70: 65 72 63 65 6e 74 20 24 74 6f 74 61 6c 5f 70 61  ercent $total_pa
2f80: 67 65 73 20 24 66 69 6c 65 5f 70 67 63 6e 74 5d  ges $file_pgcnt]
2f90: 0a 20 20 73 65 74 20 73 74 6f 72 61 67 65 20 5b  .  set storage [
2fa0: 65 78 70 72 20 7b 24 74 6f 74 61 6c 5f 70 61 67  expr {$total_pag
2fb0: 65 73 2a 24 70 61 67 65 53 69 7a 65 7d 5d 0a 20  es*$pageSize}]. 
2fc0: 20 73 65 74 20 70 61 79 6c 6f 61 64 5f 70 65 72   set payload_per
2fd0: 63 65 6e 74 20 5b 70 65 72 63 65 6e 74 20 24 70  cent [percent $p
2fe0: 61 79 6c 6f 61 64 20 24 73 74 6f 72 61 67 65 20  ayload $storage 
2ff0: 7b 6f 66 20 73 74 6f 72 61 67 65 20 63 6f 6e 73  {of storage cons
3000: 75 6d 65 64 7d 5d 0a 20 20 73 65 74 20 74 6f 74  umed}].  set tot
3010: 61 6c 5f 75 6e 75 73 65 64 20 5b 65 78 70 72 20  al_unused [expr 
3020: 7b 24 6f 76 66 6c 5f 75 6e 75 73 65 64 2b 24 69  {$ovfl_unused+$i
3030: 6e 74 5f 75 6e 75 73 65 64 2b 24 6c 65 61 66 5f  nt_unused+$leaf_
3040: 75 6e 75 73 65 64 7d 5d 0a 20 20 73 65 74 20 61  unused}].  set a
3050: 76 67 5f 70 61 79 6c 6f 61 64 20 5b 64 69 76 69  vg_payload [divi
3060: 64 65 20 24 70 61 79 6c 6f 61 64 20 24 6e 65 6e  de $payload $nen
3070: 74 72 79 5d 0a 20 20 73 65 74 20 61 76 67 5f 75  try].  set avg_u
3080: 6e 75 73 65 64 20 5b 64 69 76 69 64 65 20 24 74  nused [divide $t
3090: 6f 74 61 6c 5f 75 6e 75 73 65 64 20 24 6e 65 6e  otal_unused $nen
30a0: 74 72 79 5d 0a 20 20 69 66 20 7b 24 69 6e 74 5f  try].  if {$int_
30b0: 70 61 67 65 73 3e 30 7d 20 7b 0a 20 20 20 20 23  pages>0} {.    #
30c0: 20 54 4f 44 4f 3a 20 49 73 20 74 68 69 73 20 66   TODO: Is this f
30d0: 6f 72 6d 75 6c 61 20 63 6f 72 72 65 63 74 3f 0a  ormula correct?.
30e0: 20 20 20 20 73 65 74 20 6e 54 61 62 20 5b 6d 65      set nTab [me
30f0: 6d 20 65 76 61 6c 20 22 0a 20 20 20 20 20 20 53  m eval ".      S
3100: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
3110: 52 4f 4d 20 28 0a 20 20 20 20 20 20 20 20 20 20  ROM (.          
3120: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
3130: 74 62 6c 6e 61 6d 65 20 46 52 4f 4d 20 73 70 61  tblname FROM spa
3140: 63 65 5f 75 73 65 64 20 57 48 45 52 45 20 24 77  ce_used WHERE $w
3150: 68 65 72 65 20 41 4e 44 20 69 73 5f 69 6e 64 65  here AND is_inde
3160: 78 3d 30 0a 20 20 20 20 20 20 29 0a 20 20 20 20  x=0.      ).    
3170: 22 5d 0a 20 20 20 20 73 65 74 20 61 76 67 5f 66  "].    set avg_f
3180: 61 6e 6f 75 74 20 5b 6d 65 6d 20 65 76 61 6c 20  anout [mem eval 
3190: 22 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 28  ".      SELECT (
31a0: 73 75 6d 28 6c 65 61 66 5f 70 61 67 65 73 2b 69  sum(leaf_pages+i
31b0: 6e 74 5f 70 61 67 65 73 29 2d 24 6e 54 61 62 29  nt_pages)-$nTab)
31c0: 2f 73 75 6d 28 69 6e 74 5f 70 61 67 65 73 29 20  /sum(int_pages) 
31d0: 46 52 4f 4d 20 73 70 61 63 65 5f 75 73 65 64 0a  FROM space_used.
31e0: 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20            WHERE 
31f0: 24 77 68 65 72 65 0a 20 20 20 20 22 5d 0a 20 20  $where.    "].  
3200: 20 20 73 65 74 20 61 76 67 5f 66 61 6e 6f 75 74    set avg_fanout
3210: 20 5b 66 6f 72 6d 61 74 20 25 2e 32 66 20 24 61   [format %.2f $a
3220: 76 67 5f 66 61 6e 6f 75 74 5d 0a 20 20 7d 0a 20  vg_fanout].  }. 
3230: 20 73 65 74 20 6f 76 66 6c 5f 63 6e 74 5f 70 65   set ovfl_cnt_pe
3240: 72 63 65 6e 74 20 5b 70 65 72 63 65 6e 74 20 24  rcent [percent $
3250: 6f 76 66 6c 5f 63 6e 74 20 24 6e 65 6e 74 72 79  ovfl_cnt $nentry
3260: 20 7b 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73   {of all entries
3270: 7d 5d 0a 0a 20 20 23 20 50 72 69 6e 74 20 6f 75  }]..  # Print ou
3280: 74 20 74 68 65 20 73 75 62 2d 72 65 70 6f 72 74  t the sub-report
3290: 20 73 74 61 74 69 73 74 69 63 73 2e 0a 20 20 23   statistics..  #
32a0: 0a 20 20 73 74 61 74 6c 69 6e 65 20 7b 50 65 72  .  statline {Per
32b0: 63 65 6e 74 61 67 65 20 6f 66 20 74 6f 74 61 6c  centage of total
32c0: 20 64 61 74 61 62 61 73 65 7d 20 24 74 6f 74 61   database} $tota
32d0: 6c 5f 70 61 67 65 73 5f 70 65 72 63 65 6e 74 0a  l_pages_percent.
32e0: 20 20 73 74 61 74 6c 69 6e 65 20 7b 4e 75 6d 62    statline {Numb
32f0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 7d 20 24  er of entries} $
3300: 6e 65 6e 74 72 79 0a 20 20 73 74 61 74 6c 69 6e  nentry.  statlin
3310: 65 20 7b 42 79 74 65 73 20 6f 66 20 73 74 6f 72  e {Bytes of stor
3320: 61 67 65 20 63 6f 6e 73 75 6d 65 64 7d 20 24 73  age consumed} $s
3330: 74 6f 72 61 67 65 0a 20 20 69 66 20 7b 24 63 6f  torage.  if {$co
3340: 6d 70 72 65 73 73 65 64 5f 73 69 7a 65 21 3d 24  mpressed_size!=$
3350: 73 74 6f 72 61 67 65 7d 20 7b 0a 20 20 20 20 73  storage} {.    s
3360: 65 74 20 63 6f 6d 70 72 65 73 73 65 64 5f 73 69  et compressed_si
3370: 7a 65 20 5b 65 78 70 72 20 7b 24 63 6f 6d 70 72  ze [expr {$compr
3380: 65 73 73 65 64 5f 73 69 7a 65 2b 24 63 6f 6d 70  essed_size+$comp
3390: 72 65 73 73 4f 76 65 72 68 65 61 64 2a 24 74 6f  ressOverhead*$to
33a0: 74 61 6c 5f 70 61 67 65 73 7d 5d 0a 20 20 20 20  tal_pages}].    
33b0: 73 65 74 20 70 63 74 20 5b 65 78 70 72 20 7b 24  set pct [expr {$
33c0: 63 6f 6d 70 72 65 73 73 65 64 5f 73 69 7a 65 2a  compressed_size*
33d0: 31 30 30 2e 30 2f 24 73 74 6f 72 61 67 65 7d 5d  100.0/$storage}]
33e0: 0a 20 20 20 20 73 65 74 20 70 63 74 20 5b 66 6f  .    set pct [fo
33f0: 72 6d 61 74 20 7b 25 35 2e 31 66 25 25 7d 20 24  rmat {%5.1f%%} $
3400: 70 63 74 5d 0a 20 20 20 20 73 74 61 74 6c 69 6e  pct].    statlin
3410: 65 20 7b 42 79 74 65 73 20 75 73 65 64 20 61 66  e {Bytes used af
3420: 74 65 72 20 63 6f 6d 70 72 65 73 73 69 6f 6e 7d  ter compression}
3430: 20 24 63 6f 6d 70 72 65 73 73 65 64 5f 73 69 7a   $compressed_siz
3440: 65 20 24 70 63 74 0a 20 20 7d 0a 20 20 73 74 61  e $pct.  }.  sta
3450: 74 6c 69 6e 65 20 7b 42 79 74 65 73 20 6f 66 20  tline {Bytes of 
3460: 70 61 79 6c 6f 61 64 7d 20 24 70 61 79 6c 6f 61  payload} $payloa
3470: 64 20 24 70 61 79 6c 6f 61 64 5f 70 65 72 63 65  d $payload_perce
3480: 6e 74 0a 20 20 69 66 20 7b 24 63 6e 74 3d 3d 31  nt.  if {$cnt==1
3490: 7d 20 7b 73 74 61 74 6c 69 6e 65 20 7b 42 2d 74  } {statline {B-t
34a0: 72 65 65 20 64 65 70 74 68 7d 20 24 64 65 70 74  ree depth} $dept
34b0: 68 7d 0a 20 20 73 74 61 74 6c 69 6e 65 20 7b 41  h}.  statline {A
34c0: 76 65 72 61 67 65 20 70 61 79 6c 6f 61 64 20 70  verage payload p
34d0: 65 72 20 65 6e 74 72 79 7d 20 24 61 76 67 5f 70  er entry} $avg_p
34e0: 61 79 6c 6f 61 64 0a 20 20 73 74 61 74 6c 69 6e  ayload.  statlin
34f0: 65 20 7b 41 76 65 72 61 67 65 20 75 6e 75 73 65  e {Average unuse
3500: 64 20 62 79 74 65 73 20 70 65 72 20 65 6e 74 72  d bytes per entr
3510: 79 7d 20 24 61 76 67 5f 75 6e 75 73 65 64 0a 20  y} $avg_unused. 
3520: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
3530: 73 20 61 76 67 5f 66 61 6e 6f 75 74 5d 7d 20 7b  s avg_fanout]} {
3540: 0a 20 20 20 20 73 74 61 74 6c 69 6e 65 20 7b 41  .    statline {A
3550: 76 65 72 61 67 65 20 66 61 6e 6f 75 74 7d 20 24  verage fanout} $
3560: 61 76 67 5f 66 61 6e 6f 75 74 0a 20 20 7d 0a 20  avg_fanout.  }. 
3570: 20 69 66 20 7b 24 73 68 6f 77 46 72 61 67 20 26   if {$showFrag &
3580: 26 20 24 74 6f 74 61 6c 5f 70 61 67 65 73 3e 31  & $total_pages>1
3590: 7d 20 7b 0a 20 20 20 20 73 65 74 20 66 72 61 67  } {.    set frag
35a0: 6d 65 6e 74 61 74 69 6f 6e 20 5b 70 65 72 63 65  mentation [perce
35b0: 6e 74 20 24 67 61 70 5f 63 6e 74 20 5b 65 78 70  nt $gap_cnt [exp
35c0: 72 20 7b 24 74 6f 74 61 6c 5f 70 61 67 65 73 2d  r {$total_pages-
35d0: 31 7d 5d 5d 0a 20 20 20 20 73 74 61 74 6c 69 6e  1}]].    statlin
35e0: 65 20 7b 4e 6f 6e 2d 73 65 71 75 65 6e 74 69 61  e {Non-sequentia
35f0: 6c 20 70 61 67 65 73 7d 20 24 67 61 70 5f 63 6e  l pages} $gap_cn
3600: 74 20 24 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  t $fragmentation
3610: 0a 20 20 7d 0a 20 20 73 74 61 74 6c 69 6e 65 20  .  }.  statline 
3620: 7b 4d 61 78 69 6d 75 6d 20 70 61 79 6c 6f 61 64  {Maximum payload
3630: 20 70 65 72 20 65 6e 74 72 79 7d 20 24 6d 78 5f   per entry} $mx_
3640: 70 61 79 6c 6f 61 64 0a 20 20 73 74 61 74 6c 69  payload.  statli
3650: 6e 65 20 7b 45 6e 74 72 69 65 73 20 74 68 61 74  ne {Entries that
3660: 20 75 73 65 20 6f 76 65 72 66 6c 6f 77 7d 20 24   use overflow} $
3670: 6f 76 66 6c 5f 63 6e 74 20 24 6f 76 66 6c 5f 63  ovfl_cnt $ovfl_c
3680: 6e 74 5f 70 65 72 63 65 6e 74 0a 20 20 69 66 20  nt_percent.  if 
3690: 7b 24 69 6e 74 5f 70 61 67 65 73 3e 30 7d 20 7b  {$int_pages>0} {
36a0: 0a 20 20 20 20 73 74 61 74 6c 69 6e 65 20 7b 49  .    statline {I
36b0: 6e 64 65 78 20 70 61 67 65 73 20 75 73 65 64 7d  ndex pages used}
36c0: 20 24 69 6e 74 5f 70 61 67 65 73 0a 20 20 7d 0a   $int_pages.  }.
36d0: 20 20 73 74 61 74 6c 69 6e 65 20 7b 50 72 69 6d    statline {Prim
36e0: 61 72 79 20 70 61 67 65 73 20 75 73 65 64 7d 20  ary pages used} 
36f0: 24 6c 65 61 66 5f 70 61 67 65 73 0a 20 20 73 74  $leaf_pages.  st
3700: 61 74 6c 69 6e 65 20 7b 4f 76 65 72 66 6c 6f 77  atline {Overflow
3710: 20 70 61 67 65 73 20 75 73 65 64 7d 20 24 6f 76   pages used} $ov
3720: 66 6c 5f 70 61 67 65 73 0a 20 20 73 74 61 74 6c  fl_pages.  statl
3730: 69 6e 65 20 7b 54 6f 74 61 6c 20 70 61 67 65 73  ine {Total pages
3740: 20 75 73 65 64 7d 20 24 74 6f 74 61 6c 5f 70 61   used} $total_pa
3750: 67 65 73 0a 20 20 69 66 20 7b 24 69 6e 74 5f 75  ges.  if {$int_u
3760: 6e 75 73 65 64 3e 30 7d 20 7b 0a 20 20 20 20 73  nused>0} {.    s
3770: 65 74 20 69 6e 74 5f 75 6e 75 73 65 64 5f 70 65  et int_unused_pe
3780: 72 63 65 6e 74 20 5b 0a 20 20 20 20 20 20 20 20  rcent [.        
3790: 20 70 65 72 63 65 6e 74 20 24 69 6e 74 5f 75 6e   percent $int_un
37a0: 75 73 65 64 20 5b 65 78 70 72 20 7b 24 69 6e 74  used [expr {$int
37b0: 5f 70 61 67 65 73 2a 24 70 61 67 65 53 69 7a 65  _pages*$pageSize
37c0: 7d 5d 20 7b 6f 66 20 69 6e 64 65 78 20 73 70 61  }] {of index spa
37d0: 63 65 7d 5d 0a 20 20 20 20 73 74 61 74 6c 69 6e  ce}].    statlin
37e0: 65 20 22 55 6e 75 73 65 64 20 62 79 74 65 73 20  e "Unused bytes 
37f0: 6f 6e 20 69 6e 64 65 78 20 70 61 67 65 73 22 20  on index pages" 
3800: 24 69 6e 74 5f 75 6e 75 73 65 64 20 24 69 6e 74  $int_unused $int
3810: 5f 75 6e 75 73 65 64 5f 70 65 72 63 65 6e 74 0a  _unused_percent.
3820: 20 20 7d 0a 20 20 73 74 61 74 6c 69 6e 65 20 22    }.  statline "
3830: 55 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  Unused bytes on 
3840: 70 72 69 6d 61 72 79 20 70 61 67 65 73 22 20 24  primary pages" $
3850: 6c 65 61 66 5f 75 6e 75 73 65 64 20 5b 0a 20 20  leaf_unused [.  
3860: 20 20 20 70 65 72 63 65 6e 74 20 24 6c 65 61 66     percent $leaf
3870: 5f 75 6e 75 73 65 64 20 5b 65 78 70 72 20 7b 24  _unused [expr {$
3880: 6c 65 61 66 5f 70 61 67 65 73 2a 24 70 61 67 65  leaf_pages*$page
3890: 53 69 7a 65 7d 5d 20 7b 6f 66 20 70 72 69 6d 61  Size}] {of prima
38a0: 72 79 20 73 70 61 63 65 7d 5d 0a 20 20 73 74 61  ry space}].  sta
38b0: 74 6c 69 6e 65 20 22 55 6e 75 73 65 64 20 62 79  tline "Unused by
38c0: 74 65 73 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  tes on overflow 
38d0: 70 61 67 65 73 22 20 24 6f 76 66 6c 5f 75 6e 75  pages" $ovfl_unu
38e0: 73 65 64 20 5b 0a 20 20 20 20 20 70 65 72 63 65  sed [.     perce
38f0: 6e 74 20 24 6f 76 66 6c 5f 75 6e 75 73 65 64 20  nt $ovfl_unused 
3900: 5b 65 78 70 72 20 7b 24 6f 76 66 6c 5f 70 61 67  [expr {$ovfl_pag
3910: 65 73 2a 24 70 61 67 65 53 69 7a 65 7d 5d 20 7b  es*$pageSize}] {
3920: 6f 66 20 6f 76 65 72 66 6c 6f 77 20 73 70 61 63  of overflow spac
3930: 65 7d 5d 0a 20 20 73 74 61 74 6c 69 6e 65 20 22  e}].  statline "
3940: 55 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  Unused bytes on 
3950: 61 6c 6c 20 70 61 67 65 73 22 20 24 74 6f 74 61  all pages" $tota
3960: 6c 5f 75 6e 75 73 65 64 20 5b 0a 20 20 20 20 20  l_unused [.     
3970: 20 20 20 20 20 20 20 20 20 20 70 65 72 63 65 6e            percen
3980: 74 20 24 74 6f 74 61 6c 5f 75 6e 75 73 65 64 20  t $total_unused 
3990: 24 73 74 6f 72 61 67 65 20 7b 6f 66 20 61 6c 6c  $storage {of all
39a0: 20 73 70 61 63 65 7d 5d 0a 20 20 72 65 74 75 72   space}].  retur
39b0: 6e 20 31 0a 7d 0a 0a 23 20 43 61 6c 63 75 6c 61  n 1.}..# Calcula
39c0: 74 65 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  te the overhead 
39d0: 69 6e 20 70 61 67 65 73 20 63 61 75 73 65 64 20  in pages caused 
39e0: 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 2e 20  by auto-vacuum. 
39f0: 0a 23 0a 23 20 54 68 69 73 20 70 72 6f 63 65 64  .#.# This proced
3a00: 75 72 65 20 63 61 6c 63 75 6c 61 74 65 73 20 61  ure calculates a
3a10: 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  nd returns the n
3a20: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 75  umber of pages u
3a30: 73 65 64 20 62 79 20 74 68 65 20 0a 23 20 61 75  sed by the .# au
3a40: 74 6f 2d 76 61 63 75 75 6d 20 27 70 6f 69 6e 74  to-vacuum 'point
3a50: 65 72 2d 6d 61 70 27 2e 20 49 66 20 74 68 65 20  er-map'. If the 
3a60: 64 61 74 61 62 61 73 65 20 64 6f 65 73 20 6e 6f  database does no
3a70: 74 20 73 75 70 70 6f 72 74 20 61 75 74 6f 2d 76  t support auto-v
3a80: 61 63 75 75 6d 2c 0a 23 20 74 68 65 6e 20 30 20  acuum,.# then 0 
3a90: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  is returned. The
3aa0: 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 61   two arguments a
3ab0: 72 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  re the size of t
3ac0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
3ad0: 20 69 6e 0a 23 20 70 61 67 65 73 20 61 6e 64 20   in.# pages and 
3ae0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73  the page size us
3af0: 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61  ed by the databa
3b00: 73 65 20 28 69 6e 20 62 79 74 65 73 29 2e 0a 70  se (in bytes)..p
3b10: 72 6f 63 20 61 75 74 6f 76 61 63 75 75 6d 5f 6f  roc autovacuum_o
3b20: 76 65 72 68 65 61 64 20 7b 66 69 6c 65 50 61 67  verhead {filePag
3b30: 65 73 20 70 61 67 65 53 69 7a 65 7d 20 7b 0a 0a  es pageSize} {..
3b40: 20 20 23 20 53 65 74 20 24 61 75 74 6f 76 61 63    # Set $autovac
3b50: 75 75 6d 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20  uum to non-zero 
3b60: 66 6f 72 20 64 61 74 61 62 61 73 65 73 20 74 68  for databases th
3b70: 61 74 20 73 75 70 70 6f 72 74 20 61 75 74 6f 2d  at support auto-
3b80: 76 61 63 75 75 6d 2e 0a 20 20 73 65 74 20 61 75  vacuum..  set au
3b90: 74 6f 76 61 63 75 75 6d 20 5b 64 62 20 6f 6e 65  tovacuum [db one
3ba0: 20 7b 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61   {PRAGMA auto_va
3bb0: 63 75 75 6d 7d 5d 0a 0a 20 20 23 20 49 66 20 74  cuum}]..  # If t
3bc0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
3bd0: 6f 74 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  ot an auto-vacuu
3be0: 6d 20 64 61 74 61 62 61 73 65 20 6f 72 20 74 68  m database or th
3bf0: 65 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 0a  e file consists.
3c00: 20 20 23 20 6f 66 20 6f 6e 65 20 70 61 67 65 20    # of one page 
3c10: 6f 6e 6c 79 20 74 68 65 6e 20 74 68 65 72 65 20  only then there 
3c20: 69 73 20 6e 6f 20 6f 76 65 72 68 65 61 64 20 66  is no overhead f
3c30: 6f 72 20 61 75 74 6f 2d 76 61 63 75 75 6d 2e 20  or auto-vacuum. 
3c40: 52 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 20 20 69  Return zero..  i
3c50: 66 20 7b 30 3d 3d 24 61 75 74 6f 76 61 63 75 75  f {0==$autovacuu
3c60: 6d 20 7c 7c 20 24 66 69 6c 65 50 61 67 65 73 3d  m || $filePages=
3c70: 3d 31 7d 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  =1} {.    return
3c80: 20 30 0a 20 20 7d 0a 0a 20 20 23 20 54 68 65 20   0.  }..  # The 
3c90: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
3ca0: 73 20 6f 6e 20 65 61 63 68 20 70 6f 69 6e 74 65  s on each pointe
3cb0: 72 20 6d 61 70 20 70 61 67 65 2e 20 54 68 65 20  r map page. The 
3cc0: 6c 61 79 6f 75 74 20 6f 66 20 74 68 65 0a 20 20  layout of the.  
3cd0: 23 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  # database file 
3ce0: 69 73 20 6f 6e 65 20 70 6f 69 6e 74 65 72 2d 6d  is one pointer-m
3cf0: 61 70 20 70 61 67 65 2c 20 66 6f 6c 6c 6f 77 65  ap page, followe
3d00: 64 20 62 79 20 24 70 74 72 73 50 65 72 50 61 67  d by $ptrsPerPag
3d10: 65 20 6f 74 68 65 72 0a 20 20 23 20 70 61 67 65  e other.  # page
3d20: 73 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  s, followed by a
3d30: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
3d40: 65 20 65 74 63 2e 20 54 68 65 20 66 69 72 73 74  e etc. The first
3d50: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
3d60: 65 0a 20 20 23 20 69 73 20 74 68 65 20 73 65 63  e.  # is the sec
3d70: 6f 6e 64 20 70 61 67 65 20 6f 66 20 74 68 65 20  ond page of the 
3d80: 66 69 6c 65 20 6f 76 65 72 61 6c 6c 2e 0a 20 20  file overall..  
3d90: 73 65 74 20 70 74 72 73 50 65 72 50 61 67 65 20  set ptrsPerPage 
3da0: 5b 65 78 70 72 20 64 6f 75 62 6c 65 28 24 70 61  [expr double($pa
3db0: 67 65 53 69 7a 65 2f 35 29 5d 0a 0a 20 20 23 20  geSize/5)]..  # 
3dc0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
3dd0: 72 20 6f 66 20 70 6f 69 6e 74 65 72 20 6d 61 70  r of pointer map
3de0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
3df0: 74 61 62 61 73 65 2e 0a 20 20 72 65 74 75 72 6e  tabase..  return
3e00: 20 5b 65 78 70 72 20 77 69 64 65 28 63 65 69 6c   [expr wide(ceil
3e10: 28 20 28 24 66 69 6c 65 50 61 67 65 73 2d 31 2e  ( ($filePages-1.
3e20: 30 29 2f 28 24 70 74 72 73 50 65 72 50 61 67 65  0)/($ptrsPerPage
3e30: 2b 31 2e 30 29 20 29 29 5d 0a 7d 0a 0a 0a 23 20  +1.0) ))].}...# 
3e40: 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 73 75  Calculate the su
3e50: 6d 6d 61 72 79 20 73 74 61 74 69 73 74 69 63 73  mmary statistics
3e60: 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
3e70: 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  e and store the 
3e80: 72 65 73 75 6c 74 73 0a 23 20 69 6e 20 54 43 4c  results.# in TCL
3e90: 20 76 61 72 69 61 62 6c 65 73 2e 20 54 68 65 79   variables. They
3ea0: 20 61 72 65 20 6f 75 74 70 75 74 20 62 65 6c 6f   are output belo
3eb0: 77 2e 20 56 61 72 69 61 62 6c 65 73 20 61 72 65  w. Variables are
3ec0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 23 0a 23   as follows:.#.#
3ed0: 20 70 61 67 65 53 69 7a 65 3a 20 20 20 20 20 20   pageSize:      
3ee0: 53 69 7a 65 20 6f 66 20 65 61 63 68 20 70 61 67  Size of each pag
3ef0: 65 20 69 6e 20 62 79 74 65 73 2e 0a 23 20 66 69  e in bytes..# fi
3f00: 6c 65 5f 62 79 74 65 73 3a 20 20 20 20 46 69 6c  le_bytes:    Fil
3f10: 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 2e  e size in bytes.
3f20: 0a 23 20 66 69 6c 65 5f 70 67 63 6e 74 3a 20 20  .# file_pgcnt:  
3f30: 20 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65    Number of page
3f40: 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a 23  s in the file..#
3f50: 20 66 69 6c 65 5f 70 67 63 6e 74 32 3a 20 20 20   file_pgcnt2:   
3f60: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
3f70: 69 6e 20 74 68 65 20 66 69 6c 65 20 28 63 61 6c  in the file (cal
3f80: 63 75 6c 61 74 65 64 29 2e 0a 23 20 61 76 5f 70  culated)..# av_p
3f90: 67 63 6e 74 3a 20 20 20 20 20 20 50 61 67 65 73  gcnt:      Pages
3fa0: 20 63 6f 6e 73 75 6d 65 64 20 62 79 20 74 68 65   consumed by the
3fb0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 6f 69   auto-vacuum poi
3fc0: 6e 74 65 72 2d 6d 61 70 2e 0a 23 20 61 76 5f 70  nter-map..# av_p
3fd0: 65 72 63 65 6e 74 3a 20 20 20 20 50 65 72 63 65  ercent:    Perce
3fe0: 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c  ntage of the fil
3ff0: 65 20 63 6f 6e 73 75 6d 65 64 20 62 79 20 61 75  e consumed by au
4000: 74 6f 2d 76 61 63 75 75 6d 20 70 6f 69 6e 74 65  to-vacuum pointe
4010: 72 2d 6d 61 70 2e 0a 23 20 69 6e 75 73 65 5f 70  r-map..# inuse_p
4020: 67 63 6e 74 3a 20 20 20 44 61 74 61 20 70 61 67  gcnt:   Data pag
4030: 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a  es in the file..
4040: 23 20 69 6e 75 73 65 5f 70 65 72 63 65 6e 74 3a  # inuse_percent:
4050: 20 50 65 72 63 65 6e 74 61 67 65 20 6f 66 20 70   Percentage of p
4060: 61 67 65 73 20 75 73 65 64 20 74 6f 20 73 74 6f  ages used to sto
4070: 72 65 20 64 61 74 61 2e 0a 23 20 66 72 65 65 5f  re data..# free_
4080: 70 67 63 6e 74 3a 20 20 20 20 46 72 65 65 20 70  pgcnt:    Free p
4090: 61 67 65 73 20 63 61 6c 63 75 6c 61 74 65 64 20  ages calculated 
40a0: 61 73 20 28 3c 74 6f 74 61 6c 20 70 61 67 65 73  as (<total pages
40b0: 3e 20 2d 20 3c 69 6e 2d 75 73 65 20 70 61 67 65  > - <in-use page
40c0: 73 3e 29 0a 23 20 66 72 65 65 5f 70 67 63 6e 74  s>).# free_pgcnt
40d0: 32 3a 20 20 20 46 72 65 65 20 70 61 67 65 73 20  2:   Free pages 
40e0: 69 6e 20 74 68 65 20 66 69 6c 65 20 61 63 63 6f  in the file acco
40f0: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66 69 6c  rding to the fil
4100: 65 20 68 65 61 64 65 72 2e 0a 23 20 66 72 65 65  e header..# free
4110: 5f 70 65 72 63 65 6e 74 3a 20 20 50 65 72 63 65  _percent:  Perce
4120: 6e 74 61 67 65 20 6f 66 20 66 69 6c 65 20 63 6f  ntage of file co
4130: 6e 73 75 6d 65 64 20 62 79 20 66 72 65 65 20 70  nsumed by free p
4140: 61 67 65 73 20 28 63 61 6c 63 75 6c 61 74 65 64  ages (calculated
4150: 29 2e 0a 23 20 66 72 65 65 5f 70 65 72 63 65 6e  )..# free_percen
4160: 74 32 3a 20 50 65 72 63 65 6e 74 61 67 65 20 6f  t2: Percentage o
4170: 66 20 66 69 6c 65 20 63 6f 6e 73 75 6d 65 64 20  f file consumed 
4180: 62 79 20 66 72 65 65 20 70 61 67 65 73 20 28 68  by free pages (h
4190: 65 61 64 65 72 29 2e 0a 23 20 6e 74 61 62 6c 65  eader)..# ntable
41a0: 3a 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20  :        Number 
41b0: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
41c0: 20 64 62 2e 0a 23 20 6e 69 6e 64 65 78 3a 20 20   db..# nindex:  
41d0: 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20        Number of 
41e0: 69 6e 64 69 63 65 73 20 69 6e 20 74 68 65 20 64  indices in the d
41f0: 62 2e 0a 23 20 6e 61 75 74 6f 69 6e 64 65 78 3a  b..# nautoindex:
4200: 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e      Number of in
4210: 64 69 63 65 73 20 63 72 65 61 74 65 64 20 61 75  dices created au
4220: 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 23 20 6e  tomatically..# n
4230: 6d 61 6e 69 6e 64 65 78 3a 20 20 20 20 20 4e 75  manindex:     Nu
4240: 6d 62 65 72 20 6f 66 20 69 6e 64 69 63 65 73 20  mber of indices 
4250: 63 72 65 61 74 65 64 20 6d 61 6e 75 61 6c 6c 79  created manually
4260: 2e 0a 23 20 75 73 65 72 5f 70 61 79 6c 6f 61 64  ..# user_payload
4270: 3a 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  :  Number of byt
4280: 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20 69 6e  es of payload in
4290: 20 74 61 62 6c 65 20 62 74 72 65 65 73 20 0a 23   table btrees .#
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42b0: 28 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 73  (not including s
42c0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 29 0a 23 20  qlite_master).# 
42d0: 75 73 65 72 5f 70 65 72 63 65 6e 74 3a 20 20 24  user_percent:  $
42e0: 75 73 65 72 5f 70 61 79 6c 6f 61 64 20 61 73 20  user_payload as 
42f0: 61 20 70 65 72 63 65 6e 74 61 67 65 20 6f 66 20  a percentage of 
4300: 74 6f 74 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e  total file size.
4310: 0a 0a 23 23 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ..### The follow
4320: 69 6e 67 2c 20 73 65 74 74 69 6e 67 20 24 66 69  ing, setting $fi
4330: 6c 65 5f 62 79 74 65 73 20 62 61 73 65 64 20 6f  le_bytes based o
4340: 6e 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a  n the actual siz
4350: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 23 23  e of the file.##
4360: 23 20 6f 6e 20 64 69 73 6b 2c 20 63 61 75 73 65  # on disk, cause
4370: 73 20 74 68 69 73 20 74 6f 6f 6c 20 74 6f 20 63  s this tool to c
4380: 68 6f 6b 65 20 6f 6e 20 7a 69 70 76 66 73 20 64  hoke on zipvfs d
4390: 61 74 61 62 61 73 65 73 2e 20 53 6f 20 73 65 74  atabases. So set
43a0: 20 69 74 20 62 61 73 65 64 0a 23 23 23 20 6f 6e   it based.### on
43b0: 20 74 68 65 20 72 65 74 75 72 6e 20 6f 66 20 5b   the return of [
43c0: 50 52 41 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e  PRAGMA page_coun
43d0: 74 5d 20 69 6e 73 74 65 61 64 2e 0a 69 66 20 30  t] instead..if 0
43e0: 20 7b 0a 20 20 73 65 74 20 66 69 6c 65 5f 62 79   {.  set file_by
43f0: 74 65 73 20 20 5b 66 69 6c 65 20 73 69 7a 65 20  tes  [file size 
4400: 24 66 69 6c 65 5f 74 6f 5f 61 6e 61 6c 79 7a 65  $file_to_analyze
4410: 5d 0a 20 20 73 65 74 20 66 69 6c 65 5f 70 67 63  ].  set file_pgc
4420: 6e 74 20 20 5b 65 78 70 72 20 7b 24 66 69 6c 65  nt  [expr {$file
4430: 5f 62 79 74 65 73 2f 24 70 61 67 65 53 69 7a 65  _bytes/$pageSize
4440: 7d 5d 0a 7d 0a 73 65 74 20 66 69 6c 65 5f 70 67  }].}.set file_pg
4450: 63 6e 74 20 20 5b 64 62 20 6f 6e 65 20 7b 50 52  cnt  [db one {PR
4460: 41 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e 74 7d  AGMA page_count}
4470: 5d 0a 73 65 74 20 66 69 6c 65 5f 62 79 74 65 73  ].set file_bytes
4480: 20 20 5b 65 78 70 72 20 7b 24 66 69 6c 65 5f 70    [expr {$file_p
4490: 67 63 6e 74 20 2a 20 24 70 61 67 65 53 69 7a 65  gcnt * $pageSize
44a0: 7d 5d 0a 0a 73 65 74 20 61 76 5f 70 67 63 6e 74  }]..set av_pgcnt
44b0: 20 20 20 20 5b 61 75 74 6f 76 61 63 75 75 6d 5f      [autovacuum_
44c0: 6f 76 65 72 68 65 61 64 20 24 66 69 6c 65 5f 70  overhead $file_p
44d0: 67 63 6e 74 20 24 70 61 67 65 53 69 7a 65 5d 0a  gcnt $pageSize].
44e0: 73 65 74 20 61 76 5f 70 65 72 63 65 6e 74 20 20  set av_percent  
44f0: 5b 70 65 72 63 65 6e 74 20 24 61 76 5f 70 67 63  [percent $av_pgc
4500: 6e 74 20 24 66 69 6c 65 5f 70 67 63 6e 74 5d 0a  nt $file_pgcnt].
4510: 0a 73 65 74 20 73 71 6c 20 7b 53 45 4c 45 43 54  .set sql {SELECT
4520: 20 73 75 6d 28 6c 65 61 66 5f 70 61 67 65 73 2b   sum(leaf_pages+
4530: 69 6e 74 5f 70 61 67 65 73 2b 6f 76 66 6c 5f 70  int_pages+ovfl_p
4540: 61 67 65 73 29 20 46 52 4f 4d 20 73 70 61 63 65  ages) FROM space
4550: 5f 75 73 65 64 7d 0a 73 65 74 20 69 6e 75 73 65  _used}.set inuse
4560: 5f 70 67 63 6e 74 20 20 20 5b 65 78 70 72 20 77  _pgcnt   [expr w
4570: 69 64 65 28 5b 6d 65 6d 20 65 76 61 6c 20 24 73  ide([mem eval $s
4580: 71 6c 5d 29 5d 0a 73 65 74 20 69 6e 75 73 65 5f  ql])].set inuse_
4590: 70 65 72 63 65 6e 74 20 5b 70 65 72 63 65 6e 74  percent [percent
45a0: 20 24 69 6e 75 73 65 5f 70 67 63 6e 74 20 24 66   $inuse_pgcnt $f
45b0: 69 6c 65 5f 70 67 63 6e 74 5d 0a 0a 73 65 74 20  ile_pgcnt]..set 
45c0: 66 72 65 65 5f 70 67 63 6e 74 20 20 20 20 5b 65  free_pgcnt    [e
45d0: 78 70 72 20 7b 24 66 69 6c 65 5f 70 67 63 6e 74  xpr {$file_pgcnt
45e0: 2d 24 69 6e 75 73 65 5f 70 67 63 6e 74 2d 24 61  -$inuse_pgcnt-$a
45f0: 76 5f 70 67 63 6e 74 7d 5d 0a 73 65 74 20 66 72  v_pgcnt}].set fr
4600: 65 65 5f 70 65 72 63 65 6e 74 20 20 5b 70 65 72  ee_percent  [per
4610: 63 65 6e 74 20 24 66 72 65 65 5f 70 67 63 6e 74  cent $free_pgcnt
4620: 20 24 66 69 6c 65 5f 70 67 63 6e 74 5d 0a 73 65   $file_pgcnt].se
4630: 74 20 66 72 65 65 5f 70 67 63 6e 74 32 20 20 20  t free_pgcnt2   
4640: 5b 64 62 20 6f 6e 65 20 7b 50 52 41 47 4d 41 20  [db one {PRAGMA 
4650: 66 72 65 65 6c 69 73 74 5f 63 6f 75 6e 74 7d 5d  freelist_count}]
4660: 0a 73 65 74 20 66 72 65 65 5f 70 65 72 63 65 6e  .set free_percen
4670: 74 32 20 5b 70 65 72 63 65 6e 74 20 24 66 72 65  t2 [percent $fre
4680: 65 5f 70 67 63 6e 74 32 20 24 66 69 6c 65 5f 70  e_pgcnt2 $file_p
4690: 67 63 6e 74 5d 0a 0a 73 65 74 20 66 69 6c 65 5f  gcnt]..set file_
46a0: 70 67 63 6e 74 32 20 5b 65 78 70 72 20 7b 24 69  pgcnt2 [expr {$i
46b0: 6e 75 73 65 5f 70 67 63 6e 74 2b 24 66 72 65 65  nuse_pgcnt+$free
46c0: 5f 70 67 63 6e 74 32 2b 24 61 76 5f 70 67 63 6e  _pgcnt2+$av_pgcn
46d0: 74 7d 5d 0a 0a 73 65 74 20 6e 74 61 62 6c 65 20  t}]..set ntable 
46e0: 5b 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54  [db eval {SELECT
46f0: 20 63 6f 75 6e 74 28 2a 29 2b 31 20 46 52 4f 4d   count(*)+1 FROM
4700: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
4710: 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65  HERE type='table
4720: 27 7d 5d 0a 73 65 74 20 6e 69 6e 64 65 78 20 5b  '}].set nindex [
4730: 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20  db eval {SELECT 
4740: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73 71  count(*) FROM sq
4750: 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
4760: 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 7d 5d  E type='index'}]
4770: 0a 73 65 74 20 73 71 6c 20 7b 53 45 4c 45 43 54  .set sql {SELECT
4780: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 73   count(*) FROM s
4790: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
47a0: 52 45 20 6e 61 6d 65 20 4c 49 4b 45 20 27 73 71  RE name LIKE 'sq
47b0: 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 25 27  lite_autoindex%'
47c0: 7d 0a 73 65 74 20 6e 61 75 74 6f 69 6e 64 65 78  }.set nautoindex
47d0: 20 5b 64 62 20 65 76 61 6c 20 24 73 71 6c 5d 0a   [db eval $sql].
47e0: 73 65 74 20 6e 6d 61 6e 69 6e 64 65 78 20 5b 65  set nmanindex [e
47f0: 78 70 72 20 7b 24 6e 69 6e 64 65 78 2d 24 6e 61  xpr {$nindex-$na
4800: 75 74 6f 69 6e 64 65 78 7d 5d 0a 0a 23 20 73 65  utoindex}]..# se
4810: 74 20 74 6f 74 61 6c 5f 70 61 79 6c 6f 61 64 20  t total_payload 
4820: 5b 6d 65 6d 20 65 76 61 6c 20 22 53 45 4c 45 43  [mem eval "SELEC
4830: 54 20 73 75 6d 28 70 61 79 6c 6f 61 64 29 20 46  T sum(payload) F
4840: 52 4f 4d 20 73 70 61 63 65 5f 75 73 65 64 22 5d  ROM space_used"]
4850: 0a 73 65 74 20 75 73 65 72 5f 70 61 79 6c 6f 61  .set user_payloa
4860: 64 20 5b 6d 65 6d 20 6f 6e 65 20 7b 53 45 4c 45  d [mem one {SELE
4870: 43 54 20 69 6e 74 28 73 75 6d 28 70 61 79 6c 6f  CT int(sum(paylo
4880: 61 64 29 29 20 46 52 4f 4d 20 73 70 61 63 65 5f  ad)) FROM space_
4890: 75 73 65 64 0a 20 20 20 20 20 57 48 45 52 45 20  used.     WHERE 
48a0: 4e 4f 54 20 69 73 5f 69 6e 64 65 78 20 41 4e 44  NOT is_index AND
48b0: 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27   name NOT LIKE '
48c0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 27 7d 5d  sqlite_master'}]
48d0: 0a 73 65 74 20 75 73 65 72 5f 70 65 72 63 65 6e  .set user_percen
48e0: 74 20 5b 70 65 72 63 65 6e 74 20 24 75 73 65 72  t [percent $user
48f0: 5f 70 61 79 6c 6f 61 64 20 24 66 69 6c 65 5f 62  _payload $file_b
4900: 79 74 65 73 5d 0a 0a 23 20 4f 75 74 70 75 74 20  ytes]..# Output 
4910: 74 68 65 20 73 75 6d 6d 61 72 79 20 73 74 61 74  the summary stat
4920: 69 73 74 69 63 73 20 63 61 6c 63 75 6c 61 74 65  istics calculate
4930: 64 20 61 62 6f 76 65 2e 0a 23 0a 70 75 74 73 20  d above..#.puts 
4940: 22 2f 2a 2a 20 44 69 73 6b 2d 53 70 61 63 65 20  "/** Disk-Space 
4950: 55 74 69 6c 69 7a 61 74 69 6f 6e 20 52 65 70 6f  Utilization Repo
4960: 72 74 20 46 6f 72 20 24 72 6f 6f 74 5f 66 69 6c  rt For $root_fil
4970: 65 6e 61 6d 65 22 0a 70 75 74 73 20 22 22 0a 73  ename".puts "".s
4980: 74 61 74 6c 69 6e 65 20 7b 50 61 67 65 20 73 69  tatline {Page si
4990: 7a 65 20 69 6e 20 62 79 74 65 73 7d 20 24 70 61  ze in bytes} $pa
49a0: 67 65 53 69 7a 65 0a 73 74 61 74 6c 69 6e 65 20  geSize.statline 
49b0: 7b 50 61 67 65 73 20 69 6e 20 74 68 65 20 77 68  {Pages in the wh
49c0: 6f 6c 65 20 66 69 6c 65 20 28 6d 65 61 73 75 72  ole file (measur
49d0: 65 64 29 7d 20 24 66 69 6c 65 5f 70 67 63 6e 74  ed)} $file_pgcnt
49e0: 0a 73 74 61 74 6c 69 6e 65 20 7b 50 61 67 65 73  .statline {Pages
49f0: 20 69 6e 20 74 68 65 20 77 68 6f 6c 65 20 66 69   in the whole fi
4a00: 6c 65 20 28 63 61 6c 63 75 6c 61 74 65 64 29 7d  le (calculated)}
4a10: 20 24 66 69 6c 65 5f 70 67 63 6e 74 32 0a 73 74   $file_pgcnt2.st
4a20: 61 74 6c 69 6e 65 20 7b 50 61 67 65 73 20 74 68  atline {Pages th
4a30: 61 74 20 73 74 6f 72 65 20 64 61 74 61 7d 20 24  at store data} $
4a40: 69 6e 75 73 65 5f 70 67 63 6e 74 20 24 69 6e 75  inuse_pgcnt $inu
4a50: 73 65 5f 70 65 72 63 65 6e 74 0a 73 74 61 74 6c  se_percent.statl
4a60: 69 6e 65 20 7b 50 61 67 65 73 20 6f 6e 20 74 68  ine {Pages on th
4a70: 65 20 66 72 65 65 6c 69 73 74 20 28 70 65 72 20  e freelist (per 
4a80: 68 65 61 64 65 72 29 7d 20 24 66 72 65 65 5f 70  header)} $free_p
4a90: 67 63 6e 74 32 20 24 66 72 65 65 5f 70 65 72 63  gcnt2 $free_perc
4aa0: 65 6e 74 32 0a 73 74 61 74 6c 69 6e 65 20 7b 50  ent2.statline {P
4ab0: 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
4ac0: 6c 69 73 74 20 28 63 61 6c 63 75 6c 61 74 65 64  list (calculated
4ad0: 29 7d 20 24 66 72 65 65 5f 70 67 63 6e 74 20 24  )} $free_pgcnt $
4ae0: 66 72 65 65 5f 70 65 72 63 65 6e 74 0a 73 74 61  free_percent.sta
4af0: 74 6c 69 6e 65 20 7b 50 61 67 65 73 20 6f 66 20  tline {Pages of 
4b00: 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 76 65 72  auto-vacuum over
4b10: 68 65 61 64 7d 20 24 61 76 5f 70 67 63 6e 74 20  head} $av_pgcnt 
4b20: 24 61 76 5f 70 65 72 63 65 6e 74 0a 73 74 61 74  $av_percent.stat
4b30: 6c 69 6e 65 20 7b 4e 75 6d 62 65 72 20 6f 66 20  line {Number of 
4b40: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 61  tables in the da
4b50: 74 61 62 61 73 65 7d 20 24 6e 74 61 62 6c 65 0a  tabase} $ntable.
4b60: 73 74 61 74 6c 69 6e 65 20 7b 4e 75 6d 62 65 72  statline {Number
4b70: 20 6f 66 20 69 6e 64 69 63 65 73 7d 20 24 6e 69   of indices} $ni
4b80: 6e 64 65 78 0a 73 74 61 74 6c 69 6e 65 20 7b 4e  ndex.statline {N
4b90: 75 6d 62 65 72 20 6f 66 20 64 65 66 69 6e 65 64  umber of defined
4ba0: 20 69 6e 64 69 63 65 73 7d 20 24 6e 6d 61 6e 69   indices} $nmani
4bb0: 6e 64 65 78 0a 73 74 61 74 6c 69 6e 65 20 7b 4e  ndex.statline {N
4bc0: 75 6d 62 65 72 20 6f 66 20 69 6d 70 6c 69 65 64  umber of implied
4bd0: 20 69 6e 64 69 63 65 73 7d 20 24 6e 61 75 74 6f   indices} $nauto
4be0: 69 6e 64 65 78 0a 69 66 20 7b 24 69 73 43 6f 6d  index.if {$isCom
4bf0: 70 72 65 73 73 65 64 7d 20 7b 0a 20 20 73 74 61  pressed} {.  sta
4c00: 74 6c 69 6e 65 20 7b 53 69 7a 65 20 6f 66 20 75  tline {Size of u
4c10: 6e 63 6f 6d 70 72 65 73 73 65 64 20 63 6f 6e 74  ncompressed cont
4c20: 65 6e 74 20 69 6e 20 62 79 74 65 73 7d 20 24 66  ent in bytes} $f
4c30: 69 6c 65 5f 62 79 74 65 73 0a 20 20 73 65 74 20  ile_bytes.  set 
4c40: 65 66 66 69 63 69 65 6e 63 79 20 5b 70 65 72 63  efficiency [perc
4c50: 65 6e 74 20 24 74 72 75 65 5f 66 69 6c 65 5f 73  ent $true_file_s
4c60: 69 7a 65 20 24 66 69 6c 65 5f 62 79 74 65 73 5d  ize $file_bytes]
4c70: 0a 20 20 73 74 61 74 6c 69 6e 65 20 7b 53 69 7a  .  statline {Siz
4c80: 65 20 6f 66 20 63 6f 6d 70 72 65 73 73 65 64 20  e of compressed 
4c90: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 7d 20 24 74  file on disk} $t
4ca0: 72 75 65 5f 66 69 6c 65 5f 73 69 7a 65 20 24 65  rue_file_size $e
4cb0: 66 66 69 63 69 65 6e 63 79 0a 7d 20 65 6c 73 65  fficiency.} else
4cc0: 20 7b 0a 20 20 73 74 61 74 6c 69 6e 65 20 7b 53   {.  statline {S
4cd0: 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
4ce0: 69 6e 20 62 79 74 65 73 7d 20 24 66 69 6c 65 5f  in bytes} $file_
4cf0: 62 79 74 65 73 0a 7d 0a 73 74 61 74 6c 69 6e 65  bytes.}.statline
4d00: 20 7b 42 79 74 65 73 20 6f 66 20 75 73 65 72 20   {Bytes of user 
4d10: 70 61 79 6c 6f 61 64 20 73 74 6f 72 65 64 7d 20  payload stored} 
4d20: 24 75 73 65 72 5f 70 61 79 6c 6f 61 64 20 24 75  $user_payload $u
4d30: 73 65 72 5f 70 65 72 63 65 6e 74 0a 0a 23 20 4f  ser_percent..# O
4d40: 75 74 70 75 74 20 74 61 62 6c 65 20 72 61 6e 6b  utput table rank
4d50: 69 6e 67 73 0a 23 0a 70 75 74 73 20 22 22 0a 74  ings.#.puts "".t
4d60: 69 74 6c 65 6c 69 6e 65 20 22 50 61 67 65 20 63  itleline "Page c
4d70: 6f 75 6e 74 73 20 66 6f 72 20 61 6c 6c 20 74 61  ounts for all ta
4d80: 62 6c 65 73 20 77 69 74 68 20 74 68 65 69 72 20  bles with their 
4d90: 69 6e 64 69 63 65 73 22 0a 70 75 74 73 20 22 22  indices".puts ""
4da0: 0a 6d 65 6d 20 65 76 61 6c 20 7b 53 45 4c 45 43  .mem eval {SELEC
4db0: 54 20 74 62 6c 6e 61 6d 65 2c 20 63 6f 75 6e 74  T tblname, count
4dc0: 28 2a 29 20 41 53 20 63 6e 74 2c 20 0a 20 20 20  (*) AS cnt, .   
4dd0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 28 73             int(s
4de0: 75 6d 28 69 6e 74 5f 70 61 67 65 73 2b 6c 65 61  um(int_pages+lea
4df0: 66 5f 70 61 67 65 73 2b 6f 76 66 6c 5f 70 61 67  f_pages+ovfl_pag
4e00: 65 73 29 29 20 41 53 20 73 69 7a 65 0a 20 20 20  es)) AS size.   
4e10: 20 20 20 20 20 20 20 46 52 4f 4d 20 73 70 61 63         FROM spac
4e20: 65 5f 75 73 65 64 20 47 52 4f 55 50 20 42 59 20  e_used GROUP BY 
4e30: 74 62 6c 6e 61 6d 65 20 4f 52 44 45 52 20 42 59  tblname ORDER BY
4e40: 20 73 69 7a 65 2b 30 20 44 45 53 43 2c 20 74 62   size+0 DESC, tb
4e50: 6c 6e 61 6d 65 7d 20 7b 7d 20 7b 0a 20 20 73 74  lname} {} {.  st
4e60: 61 74 6c 69 6e 65 20 5b 73 74 72 69 6e 67 20 74  atline [string t
4e70: 6f 75 70 70 65 72 20 24 74 62 6c 6e 61 6d 65 5d  oupper $tblname]
4e80: 20 24 73 69 7a 65 20 5b 70 65 72 63 65 6e 74 20   $size [percent 
4e90: 24 73 69 7a 65 20 24 66 69 6c 65 5f 70 67 63 6e  $size $file_pgcn
4ea0: 74 5d 0a 7d 0a 70 75 74 73 20 22 22 0a 74 69 74  t].}.puts "".tit
4eb0: 6c 65 6c 69 6e 65 20 22 50 61 67 65 20 63 6f 75  leline "Page cou
4ec0: 6e 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  nts for all tabl
4ed0: 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 73  es and indices s
4ee0: 65 70 61 72 61 74 65 6c 79 22 0a 70 75 74 73 20  eparately".puts 
4ef0: 22 22 0a 6d 65 6d 20 65 76 61 6c 20 7b 0a 20 20  "".mem eval {.  
4f00: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20 75 70  SELECT.       up
4f10: 70 65 72 28 6e 61 6d 65 29 20 41 53 20 6e 6d 2c  per(name) AS nm,
4f20: 0a 20 20 20 20 20 20 20 69 6e 74 28 69 6e 74 5f  .       int(int_
4f30: 70 61 67 65 73 2b 6c 65 61 66 5f 70 61 67 65 73  pages+leaf_pages
4f40: 2b 6f 76 66 6c 5f 70 61 67 65 73 29 20 41 53 20  +ovfl_pages) AS 
4f50: 73 69 7a 65 0a 20 20 20 20 46 52 4f 4d 20 73 70  size.    FROM sp
4f60: 61 63 65 5f 75 73 65 64 0a 20 20 20 4f 52 44 45  ace_used.   ORDE
4f70: 52 20 42 59 20 73 69 7a 65 2b 30 20 44 45 53 43  R BY size+0 DESC
4f80: 2c 20 6e 61 6d 65 7d 20 7b 7d 20 7b 0a 20 20 73  , name} {} {.  s
4f90: 74 61 74 6c 69 6e 65 20 24 6e 6d 20 24 73 69 7a  tatline $nm $siz
4fa0: 65 20 5b 70 65 72 63 65 6e 74 20 24 73 69 7a 65  e [percent $size
4fb0: 20 24 66 69 6c 65 5f 70 67 63 6e 74 5d 0a 7d 0a   $file_pgcnt].}.
4fc0: 69 66 20 7b 24 69 73 43 6f 6d 70 72 65 73 73 65  if {$isCompresse
4fd0: 64 7d 20 7b 0a 20 20 70 75 74 73 20 22 22 0a 20  d} {.  puts "". 
4fe0: 20 74 69 74 6c 65 6c 69 6e 65 20 22 42 79 74 65   titleline "Byte
4ff0: 73 20 6f 66 20 64 69 73 6b 20 73 70 61 63 65 20  s of disk space 
5000: 75 73 65 64 20 61 66 74 65 72 20 63 6f 6d 70 72  used after compr
5010: 65 73 73 69 6f 6e 22 0a 20 20 70 75 74 73 20 22  ession".  puts "
5020: 22 0a 20 20 73 65 74 20 63 73 75 6d 20 30 0a 20  ".  set csum 0. 
5030: 20 6d 65 6d 20 65 76 61 6c 20 7b 53 45 4c 45 43   mem eval {SELEC
5040: 54 20 74 62 6c 6e 61 6d 65 2c 0a 20 20 20 20 20  T tblname,.     
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
5060: 28 73 75 6d 28 63 6f 6d 70 72 65 73 73 65 64 5f  (sum(compressed_
5070: 73 69 7a 65 29 29 20 2b 0a 20 20 20 20 20 20 20  size)) +.       
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5090: 20 20 24 63 6f 6d 70 72 65 73 73 4f 76 65 72 68    $compressOverh
50a0: 65 61 64 2a 73 75 6d 28 69 6e 74 5f 70 61 67 65  ead*sum(int_page
50b0: 73 2b 6c 65 61 66 5f 70 61 67 65 73 2b 6f 76 66  s+leaf_pages+ovf
50c0: 6c 5f 70 61 67 65 73 29 0a 20 20 20 20 20 20 20  l_pages).       
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50e0: 20 41 53 20 63 73 69 7a 65 0a 20 20 20 20 20 20   AS csize.      
50f0: 20 20 20 20 46 52 4f 4d 20 73 70 61 63 65 5f 75      FROM space_u
5100: 73 65 64 20 47 52 4f 55 50 20 42 59 20 74 62 6c  sed GROUP BY tbl
5110: 6e 61 6d 65 20 4f 52 44 45 52 20 42 59 20 63 73  name ORDER BY cs
5120: 69 7a 65 2b 30 20 44 45 53 43 2c 20 74 62 6c 6e  ize+0 DESC, tbln
5130: 61 6d 65 7d 20 7b 7d 20 7b 0a 20 20 20 20 69 6e  ame} {} {.    in
5140: 63 72 20 63 73 75 6d 20 24 63 73 69 7a 65 0a 20  cr csum $csize. 
5150: 20 20 20 73 74 61 74 6c 69 6e 65 20 5b 73 74 72     statline [str
5160: 69 6e 67 20 74 6f 75 70 70 65 72 20 24 74 62 6c  ing toupper $tbl
5170: 6e 61 6d 65 5d 20 24 63 73 69 7a 65 20 5b 70 65  name] $csize [pe
5180: 72 63 65 6e 74 20 24 63 73 69 7a 65 20 24 74 72  rcent $csize $tr
5190: 75 65 5f 66 69 6c 65 5f 73 69 7a 65 5d 0a 20 20  ue_file_size].  
51a0: 7d 0a 20 20 73 65 74 20 6f 76 65 72 68 65 61 64  }.  set overhead
51b0: 20 5b 65 78 70 72 20 7b 24 74 72 75 65 5f 66 69   [expr {$true_fi
51c0: 6c 65 5f 73 69 7a 65 20 2d 20 24 63 73 75 6d 7d  le_size - $csum}
51d0: 5d 0a 20 20 69 66 20 7b 24 6f 76 65 72 68 65 61  ].  if {$overhea
51e0: 64 3e 30 7d 20 7b 0a 20 20 20 20 73 74 61 74 6c  d>0} {.    statl
51f0: 69 6e 65 20 7b 48 65 61 64 65 72 20 61 6e 64 20  ine {Header and 
5200: 66 72 65 65 20 73 70 61 63 65 7d 20 24 6f 76 65  free space} $ove
5210: 72 68 65 61 64 20 5b 70 65 72 63 65 6e 74 20 24  rhead [percent $
5220: 6f 76 65 72 68 65 61 64 20 24 74 72 75 65 5f 66  overhead $true_f
5230: 69 6c 65 5f 73 69 7a 65 5d 0a 20 20 7d 0a 7d 0a  ile_size].  }.}.
5240: 0a 23 20 4f 75 74 70 75 74 20 73 75 62 72 65 70  .# Output subrep
5250: 6f 72 74 73 0a 23 0a 69 66 20 7b 24 6e 69 6e 64  orts.#.if {$nind
5260: 65 78 3e 30 7d 20 7b 0a 20 20 73 75 62 72 65 70  ex>0} {.  subrep
5270: 6f 72 74 20 7b 41 6c 6c 20 74 61 62 6c 65 73 20  ort {All tables 
5280: 61 6e 64 20 69 6e 64 69 63 65 73 7d 20 31 20 30  and indices} 1 0
5290: 0a 7d 0a 73 75 62 72 65 70 6f 72 74 20 7b 41 6c  .}.subreport {Al
52a0: 6c 20 74 61 62 6c 65 73 7d 20 7b 4e 4f 54 20 69  l tables} {NOT i
52b0: 73 5f 69 6e 64 65 78 7d 20 30 0a 69 66 20 7b 24  s_index} 0.if {$
52c0: 6e 69 6e 64 65 78 3e 30 7d 20 7b 0a 20 20 73 75  nindex>0} {.  su
52d0: 62 72 65 70 6f 72 74 20 7b 41 6c 6c 20 69 6e 64  breport {All ind
52e0: 69 63 65 73 7d 20 7b 69 73 5f 69 6e 64 65 78 7d  ices} {is_index}
52f0: 20 30 0a 7d 0a 66 6f 72 65 61 63 68 20 74 62 6c   0.}.foreach tbl
5300: 20 5b 6d 65 6d 20 65 76 61 6c 20 7b 53 45 4c 45   [mem eval {SELE
5310: 43 54 20 44 49 53 54 49 4e 43 54 20 74 62 6c 6e  CT DISTINCT tbln
5320: 61 6d 65 20 6e 61 6d 65 20 46 52 4f 4d 20 73 70  ame name FROM sp
5330: 61 63 65 5f 75 73 65 64 0a 20 20 20 20 20 20 20  ace_used.       
5340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5350: 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 7d 5d 20  ORDER BY name}] 
5360: 7b 0a 20 20 73 65 74 20 71 6e 20 5b 71 75 6f 74  {.  set qn [quot
5370: 65 20 24 74 62 6c 5d 0a 20 20 73 65 74 20 6e 61  e $tbl].  set na
5380: 6d 65 20 5b 73 74 72 69 6e 67 20 74 6f 75 70 70  me [string toupp
5390: 65 72 20 24 74 62 6c 5d 0a 20 20 73 65 74 20 6e  er $tbl].  set n
53a0: 20 5b 6d 65 6d 20 65 76 61 6c 20 7b 53 45 4c 45   [mem eval {SELE
53b0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
53c0: 20 73 70 61 63 65 5f 75 73 65 64 20 57 48 45 52   space_used WHER
53d0: 45 20 74 62 6c 6e 61 6d 65 3d 24 74 62 6c 7d 5d  E tblname=$tbl}]
53e0: 0a 20 20 69 66 20 7b 24 6e 3e 31 7d 20 7b 0a 20  .  if {$n>1} {. 
53f0: 20 20 20 73 65 74 20 69 64 78 6c 69 73 74 20 5b     set idxlist [
5400: 6d 65 6d 20 65 76 61 6c 20 22 53 45 4c 45 43 54  mem eval "SELECT
5410: 20 6e 61 6d 65 20 46 52 4f 4d 20 73 70 61 63 65   name FROM space
5420: 5f 75 73 65 64 0a 20 20 20 20 20 20 20 20 20 20  _used.          
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5440: 20 20 57 48 45 52 45 20 74 62 6c 6e 61 6d 65 3d    WHERE tblname=
5450: 27 24 71 6e 27 20 41 4e 44 20 69 73 5f 69 6e 64  '$qn' AND is_ind
5460: 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ex.             
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f                 O
5480: 52 44 45 52 20 42 59 20 31 22 5d 0a 20 20 20 20  RDER BY 1"].    
5490: 73 75 62 72 65 70 6f 72 74 20 22 54 61 62 6c 65  subreport "Table
54a0: 20 24 6e 61 6d 65 20 61 6e 64 20 61 6c 6c 20 69   $name and all i
54b0: 74 73 20 69 6e 64 69 63 65 73 22 20 22 74 62 6c  ts indices" "tbl
54c0: 6e 61 6d 65 3d 27 24 71 6e 27 22 20 30 0a 20 20  name='$qn'" 0.  
54d0: 20 20 73 75 62 72 65 70 6f 72 74 20 22 54 61 62    subreport "Tab
54e0: 6c 65 20 24 6e 61 6d 65 20 77 2f 6f 20 61 6e 79  le $name w/o any
54f0: 20 69 6e 64 69 63 65 73 22 20 22 6e 61 6d 65 3d   indices" "name=
5500: 27 24 71 6e 27 22 20 31 0a 20 20 20 20 69 66 20  '$qn'" 1.    if 
5510: 7b 5b 6c 6c 65 6e 67 74 68 20 24 69 64 78 6c 69  {[llength $idxli
5520: 73 74 5d 3e 31 7d 20 7b 0a 20 20 20 20 20 20 73  st]>1} {.      s
5530: 75 62 72 65 70 6f 72 74 20 22 49 6e 64 69 63 65  ubreport "Indice
5540: 73 20 6f 66 20 74 61 62 6c 65 20 24 6e 61 6d 65  s of table $name
5550: 22 20 22 74 62 6c 6e 61 6d 65 3d 27 24 71 6e 27  " "tblname='$qn'
5560: 20 41 4e 44 20 69 73 5f 69 6e 64 65 78 22 20 30   AND is_index" 0
5570: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 65 61  .    }.    forea
5580: 63 68 20 69 64 78 20 24 69 64 78 6c 69 73 74 20  ch idx $idxlist 
5590: 7b 0a 20 20 20 20 20 20 73 65 74 20 71 69 64 78  {.      set qidx
55a0: 20 5b 71 75 6f 74 65 20 24 69 64 78 5d 0a 20 20   [quote $idx].  
55b0: 20 20 20 20 73 75 62 72 65 70 6f 72 74 20 22 49      subreport "I
55c0: 6e 64 65 78 20 5b 73 74 72 69 6e 67 20 74 6f 75  ndex [string tou
55d0: 70 70 65 72 20 24 69 64 78 5d 20 6f 66 20 74 61  pper $idx] of ta
55e0: 62 6c 65 20 24 6e 61 6d 65 22 20 22 6e 61 6d 65  ble $name" "name
55f0: 3d 27 24 71 69 64 78 27 22 20 31 0a 20 20 20 20  ='$qidx'" 1.    
5600: 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  }.  } else {.   
5610: 20 73 75 62 72 65 70 6f 72 74 20 22 54 61 62 6c   subreport "Tabl
5620: 65 20 24 6e 61 6d 65 22 20 22 6e 61 6d 65 3d 27  e $name" "name='
5630: 24 71 6e 27 22 20 31 0a 20 20 7d 0a 7d 0a 0a 23  $qn'" 1.  }.}..#
5640: 20 4f 75 74 70 75 74 20 69 6e 73 74 72 75 63 74   Output instruct
5650: 69 6f 6e 73 20 6f 6e 20 77 68 61 74 20 74 68 65  ions on what the
5660: 20 6e 75 6d 62 65 72 73 20 61 62 6f 76 65 20 6d   numbers above m
5670: 65 61 6e 2e 0a 23 0a 70 75 74 73 20 22 22 0a 74  ean..#.puts "".t
5680: 69 74 6c 65 6c 69 6e 65 20 44 65 66 69 6e 69 74  itleline Definit
5690: 69 6f 6e 73 0a 70 75 74 73 20 7b 0a 50 61 67 65  ions.puts {.Page
56a0: 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 0a   size in bytes..
56b0: 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f      The number o
56c0: 66 20 62 79 74 65 73 20 69 6e 20 61 20 73 69 6e  f bytes in a sin
56d0: 67 6c 65 20 70 61 67 65 20 6f 66 20 74 68 65 20  gle page of the 
56e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
56f0: 0a 20 20 20 20 55 73 75 61 6c 6c 79 20 31 30 32  .    Usually 102
5700: 34 2e 0a 0a 4e 75 6d 62 65 72 20 6f 66 20 70 61  4...Number of pa
5710: 67 65 73 20 69 6e 20 74 68 65 20 77 68 6f 6c 65  ges in the whole
5720: 20 66 69 6c 65 0a 7d 0a 70 75 74 73 20 22 20 20   file.}.puts "  
5730: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
5740: 24 70 61 67 65 53 69 7a 65 2d 62 79 74 65 20 70  $pageSize-byte p
5750: 61 67 65 73 20 74 68 61 74 20 67 6f 20 69 6e 74  ages that go int
5760: 6f 20 66 6f 72 6d 69 6e 67 20 74 68 65 20 63 6f  o forming the co
5770: 6d 70 6c 65 74 65 0a 20 20 20 20 64 61 74 61 62  mplete.    datab
5780: 61 73 65 22 0a 70 75 74 73 20 7b 0a 50 61 67 65  ase".puts {.Page
5790: 73 20 74 68 61 74 20 73 74 6f 72 65 20 64 61 74  s that store dat
57a0: 61 0a 0a 20 20 20 20 54 68 65 20 6e 75 6d 62 65  a..    The numbe
57b0: 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
57c0: 73 74 6f 72 65 20 64 61 74 61 2c 20 65 69 74 68  store data, eith
57d0: 65 72 20 61 73 20 70 72 69 6d 61 72 79 20 42 2a  er as primary B*
57e0: 54 72 65 65 20 70 61 67 65 73 20 6f 72 0a 20 20  Tree pages or.  
57f0: 20 20 61 73 20 6f 76 65 72 66 6c 6f 77 20 70 61    as overflow pa
5800: 67 65 73 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ges.  The number
5810: 20 61 74 20 74 68 65 20 72 69 67 68 74 20 69 73   at the right is
5820: 20 74 68 65 20 64 61 74 61 20 70 61 67 65 73 20   the data pages 
5830: 64 69 76 69 64 65 64 20 62 79 0a 20 20 20 20 74  divided by.    t
5840: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
5850: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
5860: 66 69 6c 65 2e 0a 0a 50 61 67 65 73 20 6f 6e 20  file...Pages on 
5870: 74 68 65 20 66 72 65 65 6c 69 73 74 0a 0a 20 20  the freelist..  
5880: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
5890: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 6e  pages that are n
58a0: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  ot currently in 
58b0: 75 73 65 20 62 75 74 20 61 72 65 20 72 65 73 65  use but are rese
58c0: 72 76 65 64 20 66 6f 72 0a 20 20 20 20 66 75 74  rved for.    fut
58d0: 75 72 65 20 75 73 65 2e 20 20 54 68 65 20 70 65  ure use.  The pe
58e0: 72 63 65 6e 74 61 67 65 20 61 74 20 74 68 65 20  rcentage at the 
58f0: 72 69 67 68 74 20 69 73 20 74 68 65 20 6e 75 6d  right is the num
5900: 62 65 72 20 6f 66 20 66 72 65 65 6c 69 73 74 20  ber of freelist 
5910: 70 61 67 65 73 0a 20 20 20 20 64 69 76 69 64 65  pages.    divide
5920: 64 20 62 79 20 74 68 65 20 74 6f 74 61 6c 20 6e  d by the total n
5930: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
5940: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 0a 50 61 67  n the file...Pag
5950: 65 73 20 6f 66 20 61 75 74 6f 2d 76 61 63 75 75  es of auto-vacuu
5960: 6d 20 6f 76 65 72 68 65 61 64 0a 0a 20 20 20 20  m overhead..    
5970: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  The number of pa
5980: 67 65 73 20 74 68 61 74 20 73 74 6f 72 65 20 64  ges that store d
5990: 61 74 61 20 75 73 65 64 20 62 79 20 74 68 65 20  ata used by the 
59a0: 64 61 74 61 62 61 73 65 20 74 6f 20 66 61 63 69  database to faci
59b0: 6c 69 74 61 74 65 0a 20 20 20 20 61 75 74 6f 2d  litate.    auto-
59c0: 76 61 63 75 75 6d 2e 20 54 68 69 73 20 69 73 20  vacuum. This is 
59d0: 7a 65 72 6f 20 66 6f 72 20 64 61 74 61 62 61 73  zero for databas
59e0: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 73  es that do not s
59f0: 75 70 70 6f 72 74 20 61 75 74 6f 2d 76 61 63 75  upport auto-vacu
5a00: 75 6d 2e 0a 0a 4e 75 6d 62 65 72 20 6f 66 20 74  um...Number of t
5a10: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 61 74  ables in the dat
5a20: 61 62 61 73 65 0a 0a 20 20 20 20 54 68 65 20 6e  abase..    The n
5a30: 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
5a40: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  in the database,
5a50: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 53   including the S
5a60: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
5a70: 6c 65 0a 20 20 20 20 75 73 65 64 20 74 6f 20 73  le.    used to s
5a80: 74 6f 72 65 20 73 63 68 65 6d 61 20 69 6e 66 6f  tore schema info
5a90: 72 6d 61 74 69 6f 6e 2e 0a 0a 4e 75 6d 62 65 72  rmation...Number
5aa0: 20 6f 66 20 69 6e 64 69 63 65 73 0a 0a 20 20 20   of indices..   
5ab0: 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
5ac0: 72 20 6f 66 20 69 6e 64 69 63 65 73 20 69 6e 20  r of indices in 
5ad0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 0a 4e  the database...N
5ae0: 75 6d 62 65 72 20 6f 66 20 64 65 66 69 6e 65 64  umber of defined
5af0: 20 69 6e 64 69 63 65 73 0a 0a 20 20 20 20 54 68   indices..    Th
5b00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 69  e number of indi
5b10: 63 65 73 20 63 72 65 61 74 65 64 20 75 73 69 6e  ces created usin
5b20: 67 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52  g an explicit CR
5b30: 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
5b40: 6d 65 6e 74 2e 0a 0a 4e 75 6d 62 65 72 20 6f 66  ment...Number of
5b50: 20 69 6d 70 6c 69 65 64 20 69 6e 64 69 63 65 73   implied indices
5b60: 0a 0a 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72  ..    The number
5b70: 20 6f 66 20 69 6e 64 69 63 65 73 20 75 73 65 64   of indices used
5b80: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 50 52   to implement PR
5b90: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
5ba0: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  QUE constraints.
5bb0: 20 20 20 20 6f 6e 20 74 61 62 6c 65 73 2e 0a 0a      on tables...
5bc0: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Size of the file
5bd0: 20 69 6e 20 62 79 74 65 73 0a 0a 20 20 20 20 54   in bytes..    T
5be0: 68 65 20 74 6f 74 61 6c 20 61 6d 6f 75 6e 74 20  he total amount 
5bf0: 6f 66 20 64 69 73 6b 20 73 70 61 63 65 20 75 73  of disk space us
5c00: 65 64 20 62 79 20 74 68 65 20 65 6e 74 69 72 65  ed by the entire
5c10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
5c20: 0a 0a 42 79 74 65 73 20 6f 66 20 75 73 65 72 20  ..Bytes of user 
5c30: 70 61 79 6c 6f 61 64 20 73 74 6f 72 65 64 0a 0a  payload stored..
5c40: 20 20 20 20 54 68 65 20 74 6f 74 61 6c 20 6e 75      The total nu
5c50: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
5c60: 20 75 73 65 72 20 70 61 79 6c 6f 61 64 20 73 74   user payload st
5c70: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
5c80: 62 61 73 65 2e 20 54 68 65 0a 20 20 20 20 73 63  base. The.    sc
5c90: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
5ca0: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
5cb0: 41 53 54 45 52 20 74 61 62 6c 65 20 69 73 20 6e  ASTER table is n
5cc0: 6f 74 20 63 6f 75 6e 74 65 64 20 77 68 65 6e 0a  ot counted when.
5cd0: 20 20 20 20 63 6f 6d 70 75 74 69 6e 67 20 74 68      computing th
5ce0: 69 73 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20  is number.  The 
5cf0: 70 65 72 63 65 6e 74 61 67 65 20 61 74 20 74 68  percentage at th
5d00: 65 20 72 69 67 68 74 20 73 68 6f 77 73 20 74 68  e right shows th
5d10: 65 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 64 69  e payload.    di
5d20: 76 69 64 65 64 20 62 79 20 74 68 65 20 74 6f 74  vided by the tot
5d30: 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 0a 50  al file size...P
5d40: 65 72 63 65 6e 74 61 67 65 20 6f 66 20 74 6f 74  ercentage of tot
5d50: 61 6c 20 64 61 74 61 62 61 73 65 0a 0a 20 20 20  al database..   
5d60: 20 54 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   The amount of t
5d70: 68 65 20 63 6f 6d 70 6c 65 74 65 20 64 61 74 61  he complete data
5d80: 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 69  base file that i
5d90: 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f  s devoted to sto
5da0: 72 69 6e 67 0a 20 20 20 20 69 6e 66 6f 72 6d 61  ring.    informa
5db0: 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62  tion described b
5dc0: 79 20 74 68 69 73 20 63 61 74 65 67 6f 72 79 2e  y this category.
5dd0: 0a 0a 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  ..Number of entr
5de0: 69 65 73 0a 0a 20 20 20 20 54 68 65 20 74 6f 74  ies..    The tot
5df0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 42 2d 54  al number of B-T
5e00: 72 65 65 20 6b 65 79 2f 76 61 6c 75 65 20 70 61  ree key/value pa
5e10: 69 72 73 20 73 74 6f 72 65 64 20 75 6e 64 65 72  irs stored under
5e20: 20 74 68 69 73 20 63 61 74 65 67 6f 72 79 2e 0a   this category..
5e30: 0a 42 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67  .Bytes of storag
5e40: 65 20 63 6f 6e 73 75 6d 65 64 0a 0a 20 20 20 20  e consumed..    
5e50: 54 68 65 20 74 6f 74 61 6c 20 61 6d 6f 75 6e 74  The total amount
5e60: 20 6f 66 20 64 69 73 6b 20 73 70 61 63 65 20 72   of disk space r
5e70: 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65  equired to store
5e80: 20 61 6c 6c 20 42 2d 54 72 65 65 20 65 6e 74 72   all B-Tree entr
5e90: 69 65 73 0a 20 20 20 20 75 6e 64 65 72 20 74 68  ies.    under th
5ea0: 69 73 20 63 61 74 65 67 6f 72 79 2e 20 20 54 68  is category.  Th
5eb0: 65 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  e is the total n
5ec0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 75  umber of pages u
5ed0: 73 65 64 20 74 69 6d 65 73 0a 20 20 20 20 74 68  sed times.    th
5ee0: 65 20 70 61 67 65 73 20 73 69 7a 65 2e 0a 0a 42  e pages size...B
5ef0: 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 0a  ytes of payload.
5f00: 0a 20 20 20 20 54 68 65 20 61 6d 6f 75 6e 74 20  .    The amount 
5f10: 6f 66 20 70 61 79 6c 6f 61 64 20 73 74 6f 72 65  of payload store
5f20: 64 20 75 6e 64 65 72 20 74 68 69 73 20 63 61 74  d under this cat
5f30: 65 67 6f 72 79 2e 20 20 50 61 79 6c 6f 61 64 20  egory.  Payload 
5f40: 69 73 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  is the data.    
5f50: 70 61 72 74 20 6f 66 20 74 61 62 6c 65 20 65 6e  part of table en
5f60: 74 72 69 65 73 20 61 6e 64 20 74 68 65 20 6b 65  tries and the ke
5f70: 79 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  y part of index 
5f80: 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 70 65  entries.  The pe
5f90: 72 63 65 6e 74 61 67 65 0a 20 20 20 20 61 74 20  rcentage.    at 
5fa0: 74 68 65 20 72 69 67 68 74 20 69 73 20 74 68 65  the right is the
5fb0: 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
5fc0: 64 20 64 69 76 69 64 65 64 20 62 79 20 74 68 65  d divided by the
5fd0: 20 62 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67   bytes of storag
5fe0: 65 20 0a 20 20 20 20 63 6f 6e 73 75 6d 65 64 2e  e .    consumed.
5ff0: 0a 0a 41 76 65 72 61 67 65 20 70 61 79 6c 6f 61  ..Average payloa
6000: 64 20 70 65 72 20 65 6e 74 72 79 0a 0a 20 20 20  d per entry..   
6010: 20 54 68 65 20 61 76 65 72 61 67 65 20 61 6d 6f   The average amo
6020: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 6f  unt of payload o
6030: 6e 20 65 61 63 68 20 65 6e 74 72 79 2e 20 20 54  n each entry.  T
6040: 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65 20  his is just the 
6050: 62 79 74 65 73 20 6f 66 0a 20 20 20 20 70 61 79  bytes of.    pay
6060: 6c 6f 61 64 20 64 69 76 69 64 65 64 20 62 79 20  load divided by 
6070: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
6080: 74 72 69 65 73 2e 0a 0a 41 76 65 72 61 67 65 20  tries...Average 
6090: 75 6e 75 73 65 64 20 62 79 74 65 73 20 70 65 72  unused bytes per
60a0: 20 65 6e 74 72 79 0a 0a 20 20 20 20 54 68 65 20   entry..    The 
60b0: 61 76 65 72 61 67 65 20 61 6d 6f 75 6e 74 20 6f  average amount o
60c0: 66 20 66 72 65 65 20 73 70 61 63 65 20 72 65 6d  f free space rem
60d0: 61 69 6e 69 6e 67 20 6f 6e 20 61 6c 6c 20 70 61  aining on all pa
60e0: 67 65 73 20 75 6e 64 65 72 20 74 68 69 73 0a 20  ges under this. 
60f0: 20 20 20 63 61 74 65 67 6f 72 79 20 6f 6e 20 61     category on a
6100: 20 70 65 72 2d 65 6e 74 72 79 20 62 61 73 69 73   per-entry basis
6110: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 6e  .  This is the n
6120: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
6130: 62 79 74 65 73 20 6f 6e 0a 20 20 20 20 61 6c 6c  bytes on.    all
6140: 20 70 61 67 65 73 20 64 69 76 69 64 65 64 20 62   pages divided b
6150: 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  y the number of 
6160: 65 6e 74 72 69 65 73 2e 0a 0a 4e 6f 6e 2d 73 65  entries...Non-se
6170: 71 75 65 6e 74 69 61 6c 20 70 61 67 65 73 0a 0a  quential pages..
6180: 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f      The number o
6190: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 74  f pages in the t
61a0: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68  able or index th
61b0: 61 74 20 61 72 65 20 6f 75 74 20 6f 66 20 73 65  at are out of se
61c0: 71 75 65 6e 63 65 2e 0a 20 20 20 20 4d 61 6e 79  quence..    Many
61d0: 20 66 69 6c 65 73 79 73 74 65 6d 73 20 61 72 65   filesystems are
61e0: 20 6f 70 74 69 6d 69 7a 65 64 20 66 6f 72 20 73   optimized for s
61f0: 65 71 75 65 6e 74 69 61 6c 20 66 69 6c 65 20 61  equential file a
6200: 63 63 65 73 73 20 73 6f 20 61 20 73 6d 61 6c 6c  ccess so a small
6210: 0a 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 6e  .    number of n
6220: 6f 6e 2d 73 65 71 75 65 6e 74 69 61 6c 20 70 61  on-sequential pa
6230: 67 65 73 20 6d 69 67 68 74 20 72 65 73 75 6c 74  ges might result
6240: 20 69 6e 20 66 61 73 74 65 72 20 71 75 65 72 69   in faster queri
6250: 65 73 2c 0a 20 20 20 20 65 73 70 65 63 69 61 6c  es,.    especial
6260: 6c 79 20 66 6f 72 20 6c 61 72 67 65 72 20 64 61  ly for larger da
6270: 74 61 62 61 73 65 20 66 69 6c 65 73 20 74 68 61  tabase files tha
6280: 74 20 64 6f 20 6e 6f 74 20 66 69 74 20 69 6e 20  t do not fit in 
6290: 74 68 65 20 64 69 73 6b 20 63 61 63 68 65 2e 0a  the disk cache..
62a0: 20 20 20 20 4e 6f 74 65 20 74 68 61 74 20 61 66      Note that af
62b0: 74 65 72 20 72 75 6e 6e 69 6e 67 20 56 41 43 55  ter running VACU
62c0: 55 4d 2c 20 74 68 65 20 72 6f 6f 74 20 70 61 67  UM, the root pag
62d0: 65 20 6f 66 20 65 61 63 68 20 74 61 62 6c 65 20  e of each table 
62e0: 6f 72 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20  or index is.    
62f0: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
6300: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
6310: 20 66 69 6c 65 20 61 6e 64 20 61 6c 6c 20 6f 74   file and all ot
6320: 68 65 72 20 70 61 67 65 73 20 61 72 65 20 69 6e  her pages are in
6330: 20 61 0a 20 20 20 20 73 65 70 61 72 61 74 65 20   a.    separate 
6340: 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
6350: 62 61 73 65 20 66 69 6c 65 2c 20 72 65 73 75 6c  base file, resul
6360: 74 69 6e 67 20 69 6e 20 61 20 73 69 6e 67 6c 65  ting in a single
6370: 20 6e 6f 6e 2d 0a 20 20 20 20 73 65 71 75 65 6e   non-.    sequen
6380: 74 69 61 6c 20 70 61 67 65 2e 0a 0a 4d 61 78 69  tial page...Maxi
6390: 6d 75 6d 20 70 61 79 6c 6f 61 64 20 70 65 72 20  mum payload per 
63a0: 65 6e 74 72 79 0a 0a 20 20 20 20 54 68 65 20 6c  entry..    The l
63b0: 61 72 67 65 73 74 20 70 61 79 6c 6f 61 64 20 73  argest payload s
63c0: 69 7a 65 20 6f 66 20 61 6e 79 20 65 6e 74 72 79  ize of any entry
63d0: 2e 0a 0a 45 6e 74 72 69 65 73 20 74 68 61 74 20  ...Entries that 
63e0: 75 73 65 20 6f 76 65 72 66 6c 6f 77 0a 0a 20 20  use overflow..  
63f0: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
6400: 65 6e 74 72 69 65 73 20 74 68 61 74 20 75 73 65  entries that use
6410: 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  r one or more ov
6420: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 0a 54  erflow pages...T
6430: 6f 74 61 6c 20 70 61 67 65 73 20 75 73 65 64 0a  otal pages used.
6440: 0a 20 20 20 20 54 68 69 73 20 69 73 20 74 68 65  .    This is the
6450: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
6460: 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c   used to hold al
6470: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  l information in
6480: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20   the current.   
6490: 20 63 61 74 65 67 6f 72 79 2e 20 20 54 68 69 73   category.  This
64a0: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 69   is the sum of i
64b0: 6e 64 65 78 2c 20 70 72 69 6d 61 72 79 2c 20 61  ndex, primary, a
64c0: 6e 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nd overflow page
64d0: 73 2e 0a 0a 49 6e 64 65 78 20 70 61 67 65 73 20  s...Index pages 
64e0: 75 73 65 64 0a 0a 20 20 20 20 54 68 69 73 20 69  used..    This i
64f0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
6500: 70 61 67 65 73 20 69 6e 20 61 20 74 61 62 6c 65  pages in a table
6510: 20 42 2d 74 72 65 65 20 74 68 61 74 20 68 6f 6c   B-tree that hol
6520: 64 20 6f 6e 6c 79 20 6b 65 79 20 28 72 6f 77 69  d only key (rowi
6530: 64 29 0a 20 20 20 20 69 6e 66 6f 72 6d 61 74 69  d).    informati
6540: 6f 6e 20 61 6e 64 20 6e 6f 20 64 61 74 61 2e 0a  on and no data..
6550: 0a 50 72 69 6d 61 72 79 20 70 61 67 65 73 20 75  .Primary pages u
6560: 73 65 64 0a 0a 20 20 20 20 54 68 69 73 20 69 73  sed..    This is
6570: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 42   the number of B
6580: 2d 74 72 65 65 20 70 61 67 65 73 20 74 68 61 74  -tree pages that
6590: 20 68 6f 6c 64 20 62 6f 74 68 20 6b 65 79 20 61   hold both key a
65a0: 6e 64 20 64 61 74 61 2e 0a 0a 4f 76 65 72 66 6c  nd data...Overfl
65b0: 6f 77 20 70 61 67 65 73 20 75 73 65 64 0a 0a 20  ow pages used.. 
65c0: 20 20 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d     The total num
65d0: 62 65 72 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ber of overflow 
65e0: 70 61 67 65 73 20 75 73 65 64 20 66 6f 72 20 74  pages used for t
65f0: 68 69 73 20 63 61 74 65 67 6f 72 79 2e 0a 0a 55  his category...U
6600: 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 69  nused bytes on i
6610: 6e 64 65 78 20 70 61 67 65 73 0a 0a 20 20 20 20  ndex pages..    
6620: 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  The total number
6630: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 75 6e 75   of bytes of unu
6640: 73 65 64 20 73 70 61 63 65 20 6f 6e 20 61 6c 6c  sed space on all
6650: 20 69 6e 64 65 78 20 70 61 67 65 73 2e 20 20 54   index pages.  T
6660: 68 65 0a 20 20 20 20 70 65 72 63 65 6e 74 61 67  he.    percentag
6670: 65 20 61 74 20 74 68 65 20 72 69 67 68 74 20 69  e at the right i
6680: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
6690: 75 6e 75 73 65 64 20 62 79 74 65 73 20 64 69 76  unused bytes div
66a0: 69 64 65 64 20 62 79 20 74 68 65 0a 20 20 20 20  ided by the.    
66b0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
66c0: 62 79 74 65 73 20 6f 6e 20 69 6e 64 65 78 20 70  bytes on index p
66d0: 61 67 65 73 2e 0a 0a 55 6e 75 73 65 64 20 62 79  ages...Unused by
66e0: 74 65 73 20 6f 6e 20 70 72 69 6d 61 72 79 20 70  tes on primary p
66f0: 61 67 65 73 0a 0a 20 20 20 20 54 68 65 20 74 6f  ages..    The to
6700: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
6710: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
6720: 61 63 65 20 6f 6e 20 61 6c 6c 20 70 72 69 6d 61  ace on all prima
6730: 72 79 20 70 61 67 65 73 2e 20 20 54 68 65 0a 20  ry pages.  The. 
6740: 20 20 20 70 65 72 63 65 6e 74 61 67 65 20 61 74     percentage at
6750: 20 74 68 65 20 72 69 67 68 74 20 69 73 20 74 68   the right is th
6760: 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  e number of unus
6770: 65 64 20 62 79 74 65 73 20 64 69 76 69 64 65 64  ed bytes divided
6780: 20 62 79 20 74 68 65 0a 20 20 20 20 74 6f 74 61   by the.    tota
6790: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
67a0: 73 20 6f 6e 20 70 72 69 6d 61 72 79 20 70 61 67  s on primary pag
67b0: 65 73 2e 0a 0a 55 6e 75 73 65 64 20 62 79 74 65  es...Unused byte
67c0: 73 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s on overflow pa
67d0: 67 65 73 0a 0a 20 20 20 20 54 68 65 20 74 6f 74  ges..    The tot
67e0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  al number of byt
67f0: 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  es of unused spa
6800: 63 65 20 6f 6e 20 61 6c 6c 20 6f 76 65 72 66 6c  ce on all overfl
6810: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 0a 20  ow pages.  The. 
6820: 20 20 20 70 65 72 63 65 6e 74 61 67 65 20 61 74     percentage at
6830: 20 74 68 65 20 72 69 67 68 74 20 69 73 20 74 68   the right is th
6840: 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  e number of unus
6850: 65 64 20 62 79 74 65 73 20 64 69 76 69 64 65 64  ed bytes divided
6860: 20 62 79 20 74 68 65 0a 20 20 20 20 74 6f 74 61   by the.    tota
6870: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
6880: 73 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s on overflow pa
6890: 67 65 73 2e 0a 0a 55 6e 75 73 65 64 20 62 79 74  ges...Unused byt
68a0: 65 73 20 6f 6e 20 61 6c 6c 20 70 61 67 65 73 0a  es on all pages.
68b0: 0a 20 20 20 20 54 68 65 20 74 6f 74 61 6c 20 6e  .    The total n
68c0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
68d0: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
68e0: 6e 20 61 6c 6c 20 70 72 69 6d 61 72 79 20 61 6e  n all primary an
68f0: 64 20 6f 76 65 72 66 6c 6f 77 20 0a 20 20 20 20  d overflow .    
6900: 70 61 67 65 73 2e 20 20 54 68 65 20 70 65 72 63  pages.  The perc
6910: 65 6e 74 61 67 65 20 61 74 20 74 68 65 20 72 69  entage at the ri
6920: 67 68 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ght is the numbe
6930: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
6940: 73 20 0a 20 20 20 20 64 69 76 69 64 65 64 20 62  s .    divided b
6950: 79 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  y the total numb
6960: 65 72 20 6f 66 20 62 79 74 65 73 2e 0a 7d 0a 0a  er of bytes..}..
6970: 23 20 4f 75 74 70 75 74 20 61 20 64 75 6d 70 20  # Output a dump 
6980: 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
6990: 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
69a0: 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
69b0: 6d 6f 72 65 0a 23 20 63 6f 6d 70 6c 65 78 20 6f  more.# complex o
69c0: 66 66 6c 69 6e 65 20 61 6e 61 6c 79 73 69 73 2e  ffline analysis.
69d0: 0a 23 0a 74 69 74 6c 65 6c 69 6e 65 20 7b 7d 0a  .#.titleline {}.
69e0: 70 75 74 73 20 22 54 68 65 20 65 6e 74 69 72 65  puts "The entire
69f0: 20 74 65 78 74 20 6f 66 20 74 68 69 73 20 72 65   text of this re
6a00: 70 6f 72 74 20 63 61 6e 20 62 65 20 73 6f 75 72  port can be sour
6a10: 63 65 64 20 69 6e 74 6f 20 61 6e 79 20 53 51 4c  ced into any SQL
6a20: 20 64 61 74 61 62 61 73 65 22 0a 70 75 74 73 20   database".puts 
6a30: 22 65 6e 67 69 6e 65 20 66 6f 72 20 66 75 72 74  "engine for furt
6a40: 68 65 72 20 61 6e 61 6c 79 73 69 73 2e 20 20 41  her analysis.  A
6a50: 6c 6c 20 6f 66 20 74 68 65 20 74 65 78 74 20 61  ll of the text a
6a60: 62 6f 76 65 20 69 73 20 61 6e 20 53 51 4c 20 63  bove is an SQL c
6a70: 6f 6d 6d 65 6e 74 2e 22 0a 70 75 74 73 20 22 54  omment.".puts "T
6a80: 68 65 20 64 61 74 61 20 75 73 65 64 20 74 6f 20  he data used to 
6a90: 67 65 6e 65 72 61 74 65 20 74 68 69 73 20 72 65  generate this re
6aa0: 70 6f 72 74 20 66 6f 6c 6c 6f 77 73 3a 22 0a 70  port follows:".p
6ab0: 75 74 73 20 22 2a 2f 22 0a 70 75 74 73 20 22 42  uts "*/".puts "B
6ac0: 45 47 49 4e 3b 22 0a 70 75 74 73 20 24 74 61 62  EGIN;".puts $tab
6ad0: 6c 65 64 65 66 0a 75 6e 73 65 74 20 2d 6e 6f 63  ledef.unset -noc
6ae0: 6f 6d 70 6c 61 69 6e 20 78 0a 6d 65 6d 20 65 76  omplain x.mem ev
6af0: 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  al {SELECT * FRO
6b00: 4d 20 73 70 61 63 65 5f 75 73 65 64 7d 20 78 20  M space_used} x 
6b10: 7b 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c  {.  puts -nonewl
6b20: 69 6e 65 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  ine "INSERT INTO
6b30: 20 73 70 61 63 65 5f 75 73 65 64 20 56 41 4c 55   space_used VALU
6b40: 45 53 22 0a 20 20 73 65 74 20 73 65 70 20 28 0a  ES".  set sep (.
6b50: 20 20 66 6f 72 65 61 63 68 20 63 6f 6c 20 24 78    foreach col $x
6b60: 28 2a 29 20 7b 0a 20 20 20 20 73 65 74 20 76 20  (*) {.    set v 
6b70: 24 78 28 24 63 6f 6c 29 0a 20 20 20 20 69 66 20  $x($col).    if 
6b80: 7b 24 76 3d 3d 22 22 20 7c 7c 20 21 5b 73 74 72  {$v=="" || ![str
6b90: 69 6e 67 20 69 73 20 64 6f 75 62 6c 65 20 24 76  ing is double $v
6ba0: 5d 7d 20 7b 73 65 74 20 76 20 27 5b 71 75 6f 74  ]} {set v '[quot
6bb0: 65 20 24 76 5d 27 7d 0a 20 20 20 20 70 75 74 73  e $v]'}.    puts
6bc0: 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 73 65 70   -nonewline $sep
6bd0: 24 76 0a 20 20 20 20 73 65 74 20 73 65 70 20 2c  $v.    set sep ,
6be0: 0a 20 20 7d 0a 20 20 70 75 74 73 20 22 29 3b 22  .  }.  puts ");"
6bf0: 0a 7d 0a 70 75 74 73 20 22 43 4f 4d 4d 49 54 3b  .}.puts "COMMIT;
6c00: 22 0a 0a 7d 20 65 72 72 5d 7d 20 7b 0a 20 20 70  "..} err]} {.  p
6c10: 75 74 73 20 22 45 52 52 4f 52 3a 20 24 65 72 72  uts "ERROR: $err
6c20: 22 0a 20 20 70 75 74 73 20 24 65 72 72 6f 72 49  ".  puts $errorI
6c30: 6e 66 6f 0a 20 20 65 78 69 74 20 31 0a 7d 0a     nfo.  exit 1.}.