/ Hex Artifact Content
Login

Artifact a1ba7f05762dfad4c987b75cab6b317823319aa5:


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 23 20 47 65 74  unused..#..# Get
00c0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
00d0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 6e 61   database to ana
00e0: 6c 79 7a 65 0a 23 0a 23 73 65 74 20 61 72 67 76  lyze.#.#set argv
00f0: 20 24 61 72 67 76 30 0a 69 66 20 7b 5b 6c 6c 65   $argv0.if {[lle
0100: 6e 67 74 68 20 24 61 72 67 76 5d 21 3d 31 7d 20  ngth $argv]!=1} 
0110: 7b 0a 20 20 70 75 74 73 20 73 74 64 65 72 72 20  {.  puts stderr 
0120: 22 55 73 61 67 65 3a 20 24 61 72 67 76 30 20 64  "Usage: $argv0 d
0130: 61 74 61 62 61 73 65 2d 6e 61 6d 65 22 0a 20 20  atabase-name".  
0140: 65 78 69 74 20 31 0a 7d 0a 73 65 74 20 66 69 6c  exit 1.}.set fil
0150: 65 5f 74 6f 5f 61 6e 61 6c 79 7a 65 20 5b 6c 69  e_to_analyze [li
0160: 6e 64 65 78 20 24 61 72 67 76 20 30 5d 0a 69 66  ndex $argv 0].if
0170: 20 7b 21 5b 66 69 6c 65 20 65 78 69 73 74 73 20   {![file exists 
0180: 24 66 69 6c 65 5f 74 6f 5f 61 6e 61 6c 79 7a 65  $file_to_analyze
0190: 5d 7d 20 7b 0a 20 20 70 75 74 73 20 73 74 64 65  ]} {.  puts stde
01a0: 72 72 20 22 4e 6f 20 73 75 63 68 20 66 69 6c 65  rr "No such file
01b0: 3a 20 24 66 69 6c 65 5f 74 6f 5f 61 6e 61 6c 79  : $file_to_analy
01c0: 7a 65 22 0a 20 20 65 78 69 74 20 31 0a 7d 0a 69  ze".  exit 1.}.i
01d0: 66 20 7b 21 5b 66 69 6c 65 20 72 65 61 64 61 62  f {![file readab
01e0: 6c 65 20 24 66 69 6c 65 5f 74 6f 5f 61 6e 61 6c  le $file_to_anal
01f0: 79 7a 65 5d 7d 20 7b 0a 20 20 70 75 74 73 20 73  yze]} {.  puts s
0200: 74 64 65 72 72 20 22 46 69 6c 65 20 69 73 20 6e  tderr "File is n
0210: 6f 74 20 72 65 61 64 61 62 6c 65 3a 20 24 66 69  ot readable: $fi
0220: 6c 65 5f 74 6f 5f 61 6e 61 6c 79 7a 65 22 0a 20  le_to_analyze". 
0230: 20 65 78 69 74 20 31 0a 7d 0a 69 66 20 7b 5b 66   exit 1.}.if {[f
0240: 69 6c 65 20 73 69 7a 65 20 24 66 69 6c 65 5f 74  ile size $file_t
0250: 6f 5f 61 6e 61 6c 79 7a 65 5d 3c 35 31 32 7d 20  o_analyze]<512} 
0260: 7b 0a 20 20 70 75 74 73 20 73 74 64 65 72 72 20  {.  puts stderr 
0270: 22 45 6d 70 74 79 20 6f 72 20 6d 61 6c 66 6f 72  "Empty or malfor
0280: 6d 65 64 20 64 61 74 61 62 61 73 65 3a 20 24 66  med database: $f
0290: 69 6c 65 5f 74 6f 5f 61 6e 61 6c 79 7a 65 22 0a  ile_to_analyze".
02a0: 20 20 65 78 69 74 20 31 0a 7d 0a 0a 23 20 4f 70    exit 1.}..# Op
02b0: 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  en the database.
02c0: 23 0a 73 71 6c 69 74 65 33 20 64 62 20 5b 6c 69  #.sqlite3 db [li
02d0: 6e 64 65 78 20 24 61 72 67 76 20 30 5d 0a 73 65  ndex $argv 0].se
02e0: 74 20 44 42 20 5b 62 74 72 65 65 5f 6f 70 65 6e  t DB [btree_open
02f0: 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 76 20 30   [lindex $argv 0
0300: 5d 20 31 30 30 30 20 30 5d 0a 0a 23 20 49 6e 2d  ] 1000 0]..# In-
0310: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
0320: 66 6f 72 20 63 6f 6c 6c 65 63 74 69 6e 67 20 73  for collecting s
0330: 74 61 74 69 73 74 69 63 73 0a 23 0a 73 71 6c 69  tatistics.#.sqli
0340: 74 65 33 20 6d 65 6d 20 3a 6d 65 6d 6f 72 79 3a  te3 mem :memory:
0350: 0a 73 65 74 20 74 61 62 6c 65 64 65 66 5c 0a 7b  .set tabledef\.{
0360: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 70 61  CREATE TABLE spa
0370: 63 65 5f 75 73 65 64 28 0a 20 20 20 6e 61 6d 65  ce_used(.   name
0380: 20 63 6c 6f 62 2c 20 20 20 20 20 20 20 20 2d 2d   clob,        --
0390: 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   Name of a table
03a0: 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 74 68 65   or index in the
03b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
03c0: 20 20 74 62 6c 6e 61 6d 65 20 63 6c 6f 62 2c 20    tblname clob, 
03d0: 20 20 20 20 2d 2d 20 4e 61 6d 65 20 6f 66 20 61      -- Name of a
03e0: 73 73 6f 63 69 61 74 65 64 20 74 61 62 6c 65 0a  ssociated table.
03f0: 20 20 20 69 73 5f 69 6e 64 65 78 20 62 6f 6f 6c     is_index bool
0400: 65 61 6e 2c 20 2d 2d 20 54 52 55 45 20 69 66 20  ean, -- TRUE if 
0410: 69 74 20 69 73 20 61 6e 20 69 6e 64 65 78 2c 20  it is an index, 
0420: 66 61 6c 73 65 20 66 6f 72 20 61 20 74 61 62 6c  false for a tabl
0430: 65 0a 20 20 20 6e 65 6e 74 72 79 20 69 6e 74 2c  e.   nentry int,
0440: 20 20 20 20 20 20 20 2d 2d 20 4e 75 6d 62 65 72         -- Number
0450: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
0460: 68 65 20 42 54 72 65 65 0a 20 20 20 6c 65 61 66  he BTree.   leaf
0470: 5f 65 6e 74 72 69 65 73 20 69 6e 74 2c 20 2d 2d  _entries int, --
0480: 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   Number of leaf 
0490: 65 6e 74 72 69 65 73 0a 20 20 20 70 61 79 6c 6f  entries.   paylo
04a0: 61 64 20 69 6e 74 2c 20 20 20 20 20 20 2d 2d 20  ad int,      -- 
04b0: 54 6f 74 61 6c 20 61 6d 6f 75 6e 74 20 6f 66 20  Total amount of 
04c0: 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
04d0: 68 69 73 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  his table or ind
04e0: 65 78 0a 20 20 20 6f 76 66 6c 5f 70 61 79 6c 6f  ex.   ovfl_paylo
04f0: 61 64 20 69 6e 74 2c 20 2d 2d 20 54 6f 74 61 6c  ad int, -- Total
0500: 20 61 6d 6f 75 6e 74 20 6f 66 20 64 61 74 61 20   amount of data 
0510: 73 74 6f 72 65 64 20 6f 6e 20 6f 76 65 72 66 6c  stored on overfl
0520: 6f 77 20 70 61 67 65 73 0a 20 20 20 6f 76 66 6c  ow pages.   ovfl
0530: 5f 63 6e 74 20 69 6e 74 2c 20 20 20 20 20 2d 2d  _cnt int,     --
0540: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
0550: 65 73 20 74 68 61 74 20 75 73 65 20 6f 76 65 72  es that use over
0560: 66 6c 6f 77 0a 20 20 20 6d 78 5f 70 61 79 6c 6f  flow.   mx_paylo
0570: 61 64 20 69 6e 74 2c 20 20 20 2d 2d 20 4d 61 78  ad int,   -- Max
0580: 69 6d 75 6d 20 70 61 79 6c 6f 61 64 20 73 69 7a  imum payload siz
0590: 65 0a 20 20 20 69 6e 74 5f 70 61 67 65 73 20 69  e.   int_pages i
05a0: 6e 74 2c 20 20 20 20 2d 2d 20 4e 75 6d 62 65 72  nt,    -- Number
05b0: 20 6f 66 20 69 6e 74 65 72 69 6f 72 20 70 61 67   of interior pag
05c0: 65 73 20 75 73 65 64 0a 20 20 20 6c 65 61 66 5f  es used.   leaf_
05d0: 70 61 67 65 73 20 69 6e 74 2c 20 20 20 2d 2d 20  pages int,   -- 
05e0: 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  Number of leaf p
05f0: 61 67 65 73 20 75 73 65 64 0a 20 20 20 6f 76 66  ages used.   ovf
0600: 6c 5f 70 61 67 65 73 20 69 6e 74 2c 20 20 20 2d  l_pages int,   -
0610: 2d 20 4e 75 6d 62 65 72 20 6f 66 20 6f 76 65 72  - Number of over
0620: 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64 0a  flow pages used.
0630: 20 20 20 69 6e 74 5f 75 6e 75 73 65 64 20 69 6e     int_unused in
0640: 74 2c 20 20 20 2d 2d 20 4e 75 6d 62 65 72 20 6f  t,   -- Number o
0650: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f  f unused bytes o
0660: 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73  n interior pages
0670: 0a 20 20 20 6c 65 61 66 5f 75 6e 75 73 65 64 20  .   leaf_unused 
0680: 69 6e 74 2c 20 20 2d 2d 20 4e 75 6d 62 65 72 20  int,  -- Number 
0690: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
06a0: 6f 6e 20 70 72 69 6d 61 72 79 20 70 61 67 65 73  on primary pages
06b0: 0a 20 20 20 6f 76 66 6c 5f 75 6e 75 73 65 64 20  .   ovfl_unused 
06c0: 69 6e 74 20 20 20 2d 2d 20 4e 75 6d 62 65 72 20  int   -- Number 
06d0: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
06e0: 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  on overflow page
06f0: 73 0a 29 3b 7d 0a 6d 65 6d 20 65 76 61 6c 20 24  s.);}.mem eval $
0700: 74 61 62 6c 65 64 65 66 0a 0a 23 20 54 68 69 73  tabledef..# This
0710: 20 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 75   query will be u
0720: 73 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20  sed to find the 
0730: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
0740: 20 66 6f 72 20 65 76 65 72 79 20 74 61 62 6c 65   for every table
0750: 0a 23 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  .# in the databa
0760: 73 65 2e 0a 23 0a 73 65 74 20 73 71 6c 20 7b 0a  se..#.set sql {.
0770: 20 20 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 72    SELECT name, r
0780: 6f 6f 74 70 61 67 65 20 0a 20 20 20 20 46 52 4f  ootpage .    FRO
0790: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
07a0: 57 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c  WHERE type='tabl
07b0: 65 27 0a 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20  e'.  UNION ALL. 
07c0: 20 53 45 4c 45 43 54 20 27 73 71 6c 69 74 65 5f   SELECT 'sqlite_
07d0: 6d 61 73 74 65 72 27 2c 20 31 0a 20 20 4f 52 44  master', 1.  ORD
07e0: 45 52 20 42 59 20 31 0a 7d 0a 0a 23 20 51 75 6f  ER BY 1.}..# Quo
07f0: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20  te a string for 
0800: 53 51 4c 0a 23 0a 70 72 6f 63 20 71 75 6f 74 65  SQL.#.proc quote
0810: 20 74 78 74 20 7b 0a 20 20 72 65 67 73 75 62 20   txt {.  regsub 
0820: 2d 61 6c 6c 20 27 20 24 74 78 74 20 27 27 20 71  -all ' $txt '' q
0830: 0a 20 20 72 65 74 75 72 6e 20 27 24 71 27 0a 7d  .  return '$q'.}
0840: 0a 0a 23 20 41 6e 61 6c 79 7a 65 20 65 76 65 72  ..# Analyze ever
0850: 79 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  y table in the d
0860: 61 74 61 62 61 73 65 2c 20 6f 6e 65 20 61 74 20  atabase, one at 
0870: 61 20 74 69 6d 65 2e 0a 23 0a 73 65 74 20 70 61  a time..#.set pa
0880: 67 65 53 69 7a 65 20 5b 64 62 20 65 76 61 6c 20  geSize [db eval 
0890: 7b 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a  {PRAGMA page_siz
08a0: 65 7d 5d 0a 66 6f 72 65 61 63 68 20 7b 6e 61 6d  e}].foreach {nam
08b0: 65 20 72 6f 6f 74 70 61 67 65 7d 20 5b 64 62 20  e rootpage} [db 
08c0: 65 76 61 6c 20 24 73 71 6c 5d 20 7b 0a 20 20 70  eval $sql] {.  p
08d0: 75 74 73 20 73 74 64 65 72 72 20 22 41 6e 61 6c  uts stderr "Anal
08e0: 79 7a 69 6e 67 20 74 61 62 6c 65 20 24 6e 61 6d  yzing table $nam
08f0: 65 2e 2e 2e 22 0a 20 20 73 65 74 20 63 75 72 73  e...".  set curs
0900: 6f 72 20 5b 62 74 72 65 65 5f 63 75 72 73 6f 72  or [btree_cursor
0910: 20 24 44 42 20 24 72 6f 6f 74 70 61 67 65 20 30   $DB $rootpage 0
0920: 5d 0a 20 20 73 65 74 20 67 6f 20 5b 62 74 72 65  ].  set go [btre
0930: 65 5f 66 69 72 73 74 20 24 63 75 72 73 6f 72 5d  e_first $cursor]
0940: 0a 20 20 63 61 74 63 68 20 7b 75 6e 73 65 74 20  .  catch {unset 
0950: 73 65 65 6e 7d 0a 20 20 73 65 74 20 74 6f 74 61  seen}.  set tota
0960: 6c 5f 70 61 79 6c 6f 61 64 20 30 20 20 20 20 20  l_payload 0     
0970: 20 20 20 3b 23 20 50 61 79 6c 6f 61 64 20 73 70     ;# Payload sp
0980: 61 63 65 20 75 73 65 64 20 62 79 20 61 6c 6c 20  ace used by all 
0990: 65 6e 74 72 69 65 73 0a 20 20 73 65 74 20 74 6f  entries.  set to
09a0: 74 61 6c 5f 6f 76 66 6c 20 30 20 20 20 20 20 20  tal_ovfl 0      
09b0: 20 20 20 20 20 3b 23 20 50 61 79 6c 6f 61 64 20       ;# Payload 
09c0: 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f  space on overflo
09d0: 77 20 70 61 67 65 73 0a 20 20 73 65 74 20 75 6e  w pages.  set un
09e0: 75 73 65 64 5f 69 6e 74 20 30 20 20 20 20 20 20  used_int 0      
09f0: 20 20 20 20 20 3b 23 20 55 6e 75 73 65 64 20 73       ;# Unused s
0a00: 70 61 63 65 20 6f 6e 20 69 6e 74 65 72 69 6f 72  pace on interior
0a10: 20 6e 6f 64 65 73 0a 20 20 73 65 74 20 75 6e 75   nodes.  set unu
0a20: 73 65 64 5f 6c 65 61 66 20 30 20 20 20 20 20 20  sed_leaf 0      
0a30: 20 20 20 20 3b 23 20 55 6e 75 73 65 64 20 73 70      ;# Unused sp
0a40: 61 63 65 20 6f 6e 20 6c 65 61 66 20 6e 6f 64 65  ace on leaf node
0a50: 73 0a 20 20 73 65 74 20 75 6e 75 73 65 64 5f 6f  s.  set unused_o
0a60: 76 66 6c 20 30 20 20 20 20 20 20 20 20 20 20 3b  vfl 0          ;
0a70: 23 20 55 6e 75 73 65 64 20 73 70 61 63 65 20 6f  # Unused space o
0a80: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  n overflow pages
0a90: 0a 20 20 73 65 74 20 63 6e 74 5f 6f 76 66 6c 20  .  set cnt_ovfl 
0aa0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 23  0             ;#
0ab0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
0ac0: 65 73 20 74 68 61 74 20 75 73 65 20 6f 76 65 72  es that use over
0ad0: 66 6c 6f 77 73 0a 20 20 73 65 74 20 63 6e 74 5f  flows.  set cnt_
0ae0: 6c 65 61 66 5f 65 6e 74 72 79 20 30 20 20 20 20  leaf_entry 0    
0af0: 20 20 20 3b 23 20 4e 75 6d 62 65 72 20 6f 66 20     ;# Number of 
0b00: 6c 65 61 66 20 65 6e 74 72 69 65 73 0a 20 20 73  leaf entries.  s
0b10: 65 74 20 63 6e 74 5f 69 6e 74 5f 65 6e 74 72 79  et cnt_int_entry
0b20: 20 30 20 20 20 20 20 20 20 20 3b 23 20 4e 75 6d   0        ;# Num
0b30: 62 65 72 20 6f 66 20 69 6e 74 65 72 6f 72 20 65  ber of interor e
0b40: 6e 74 72 69 65 73 0a 20 20 73 65 74 20 6d 78 5f  ntries.  set mx_
0b50: 70 61 79 6c 6f 61 64 20 30 20 20 20 20 20 20 20  payload 0       
0b60: 20 20 20 20 3b 23 20 4d 61 78 69 6d 75 6d 20 70      ;# Maximum p
0b70: 61 79 6c 6f 61 64 20 73 69 7a 65 0a 20 20 73 65  ayload size.  se
0b80: 74 20 6f 76 66 6c 5f 70 61 67 65 73 20 30 20 20  t ovfl_pages 0  
0b90: 20 20 20 20 20 20 20 20 20 3b 23 20 4e 75 6d 62           ;# Numb
0ba0: 65 72 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  er of overflow p
0bb0: 61 67 65 73 20 75 73 65 64 0a 20 20 73 65 74 20  ages used.  set 
0bc0: 6c 65 61 66 5f 70 61 67 65 73 20 30 20 20 20 20  leaf_pages 0    
0bd0: 20 20 20 20 20 20 20 3b 23 20 4e 75 6d 62 65 72         ;# Number
0be0: 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 0a 20   of leaf pages. 
0bf0: 20 73 65 74 20 69 6e 74 5f 70 61 67 65 73 20 30   set int_pages 0
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 3b 23 20 4e              ;# N
0c10: 75 6d 62 65 72 20 6f 66 20 69 6e 74 65 72 69 6f  umber of interio
0c20: 72 20 70 61 67 65 73 0a 20 20 77 68 69 6c 65 20  r pages.  while 
0c30: 7b 24 67 6f 3d 3d 30 7d 20 7b 0a 20 20 20 20 69  {$go==0} {.    i
0c40: 6e 63 72 20 63 6e 74 5f 6c 65 61 66 5f 65 6e 74  ncr cnt_leaf_ent
0c50: 72 79 0a 20 20 20 20 73 65 74 20 73 74 61 74 20  ry.    set stat 
0c60: 5b 62 74 72 65 65 5f 63 75 72 73 6f 72 5f 69 6e  [btree_cursor_in
0c70: 66 6f 20 24 63 75 72 73 6f 72 5d 0a 20 20 20 20  fo $cursor].    
0c80: 73 65 74 20 70 61 79 6c 6f 61 64 20 5b 6c 69 6e  set payload [lin
0c90: 64 65 78 20 24 73 74 61 74 20 36 5d 0a 20 20 20  dex $stat 6].   
0ca0: 20 69 66 20 7b 24 70 61 79 6c 6f 61 64 3e 24 6d   if {$payload>$m
0cb0: 78 5f 70 61 79 6c 6f 61 64 7d 20 7b 73 65 74 20  x_payload} {set 
0cc0: 6d 78 5f 70 61 79 6c 6f 61 64 20 24 70 61 79 6c  mx_payload $payl
0cd0: 6f 61 64 7d 0a 20 20 20 20 69 6e 63 72 20 74 6f  oad}.    incr to
0ce0: 74 61 6c 5f 70 61 79 6c 6f 61 64 20 24 70 61 79  tal_payload $pay
0cf0: 6c 6f 61 64 0a 20 20 20 20 73 65 74 20 6c 6f 63  load.    set loc
0d00: 61 6c 20 5b 6c 69 6e 64 65 78 20 24 73 74 61 74  al [lindex $stat
0d10: 20 38 5d 20 20 20 20 0a 20 20 20 20 73 65 74 20   8]    .    set 
0d20: 6f 76 66 6c 20 5b 65 78 70 72 20 7b 24 70 61 79  ovfl [expr {$pay
0d30: 6c 6f 61 64 2d 24 6c 6f 63 61 6c 7d 5d 0a 20 20  load-$local}].  
0d40: 20 20 69 66 20 7b 24 6f 76 66 6c 7d 20 7b 0a 20    if {$ovfl} {. 
0d50: 20 20 20 20 20 69 6e 63 72 20 63 6e 74 5f 6f 76       incr cnt_ov
0d60: 66 6c 0a 20 20 20 20 20 20 69 6e 63 72 20 74 6f  fl.      incr to
0d70: 74 61 6c 5f 6f 76 66 6c 20 24 6f 76 66 6c 0a 20  tal_ovfl $ovfl. 
0d80: 20 20 20 20 20 73 65 74 20 6e 20 5b 65 78 70 72       set n [expr
0d90: 20 7b 69 6e 74 28 63 65 69 6c 28 24 6f 76 66 6c   {int(ceil($ovfl
0da0: 2f 28 24 70 61 67 65 53 69 7a 65 2d 34 2e 30 29  /($pageSize-4.0)
0db0: 29 29 7d 5d 0a 20 20 20 20 20 20 69 6e 63 72 20  ))}].      incr 
0dc0: 6f 76 66 6c 5f 70 61 67 65 73 20 24 6e 0a 20 20  ovfl_pages $n.  
0dd0: 20 20 20 20 69 6e 63 72 20 75 6e 75 73 65 64 5f      incr unused_
0de0: 6f 76 66 6c 20 5b 65 78 70 72 20 7b 24 6e 2a 28  ovfl [expr {$n*(
0df0: 24 70 61 67 65 53 69 7a 65 2d 34 29 20 2d 20 24  $pageSize-4) - $
0e00: 6f 76 66 6c 7d 5d 0a 20 20 20 20 7d 0a 20 20 20  ovfl}].    }.   
0e10: 20 73 65 74 20 70 67 6e 6f 20 5b 6c 69 6e 64 65   set pgno [linde
0e20: 78 20 24 73 74 61 74 20 30 5d 0a 20 20 20 20 69  x $stat 0].    i
0e30: 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  f {![info exists
0e40: 20 73 65 65 6e 28 24 70 67 6e 6f 29 5d 7d 20 7b   seen($pgno)]} {
0e50: 0a 20 20 20 20 20 20 73 65 74 20 73 65 65 6e 28  .      set seen(
0e60: 24 70 67 6e 6f 29 20 31 0a 20 20 20 20 20 20 69  $pgno) 1.      i
0e70: 6e 63 72 20 6c 65 61 66 5f 70 61 67 65 73 0a 20  ncr leaf_pages. 
0e80: 20 20 20 20 20 69 6e 63 72 20 75 6e 75 73 65 64       incr unused
0e90: 5f 6c 65 61 66 20 5b 6c 69 6e 64 65 78 20 24 73  _leaf [lindex $s
0ea0: 74 61 74 20 34 5d 0a 20 20 20 20 20 20 73 65 74  tat 4].      set
0eb0: 20 70 61 72 65 6e 74 20 5b 6c 69 6e 64 65 78 20   parent [lindex 
0ec0: 24 73 74 61 74 20 39 5d 0a 20 20 20 20 20 20 73  $stat 9].      s
0ed0: 65 74 20 75 70 20 30 0a 20 20 20 20 20 20 77 68  et up 0.      wh
0ee0: 69 6c 65 20 7b 24 70 61 72 65 6e 74 21 3d 30 20  ile {$parent!=0 
0ef0: 26 26 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73  && ![info exists
0f00: 20 73 65 65 6e 28 24 70 61 72 65 6e 74 29 5d 7d   seen($parent)]}
0f10: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20   {.        incr 
0f20: 75 70 0a 20 20 20 20 20 20 20 20 73 65 74 20 73  up.        set s
0f30: 74 61 74 20 5b 62 74 72 65 65 5f 63 75 72 73 6f  tat [btree_curso
0f40: 72 5f 69 6e 66 6f 20 24 63 75 72 73 6f 72 20 24  r_info $cursor $
0f50: 75 70 5d 0a 20 20 20 20 20 20 20 20 73 65 74 20  up].        set 
0f60: 73 65 65 6e 28 24 70 61 72 65 6e 74 29 20 31 0a  seen($parent) 1.
0f70: 20 20 20 20 20 20 20 20 69 6e 63 72 20 69 6e 74          incr int
0f80: 5f 70 61 67 65 73 0a 20 20 20 20 20 20 20 20 69  _pages.        i
0f90: 6e 63 72 20 63 6e 74 5f 69 6e 74 5f 65 6e 74 72  ncr cnt_int_entr
0fa0: 79 20 5b 6c 69 6e 64 65 78 20 24 73 74 61 74 20  y [lindex $stat 
0fb0: 32 5d 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20  2].        incr 
0fc0: 75 6e 75 73 65 64 5f 69 6e 74 20 5b 6c 69 6e 64  unused_int [lind
0fd0: 65 78 20 24 73 74 61 74 20 34 5d 0a 20 20 20 20  ex $stat 4].    
0fe0: 20 20 20 20 73 65 74 20 70 61 72 65 6e 74 20 5b      set parent [
0ff0: 6c 69 6e 64 65 78 20 24 73 74 61 74 20 39 5d 0a  lindex $stat 9].
1000: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1010: 20 20 73 65 74 20 67 6f 20 5b 62 74 72 65 65 5f    set go [btree_
1020: 6e 65 78 74 20 24 63 75 72 73 6f 72 5d 0a 20 20  next $cursor].  
1030: 7d 0a 20 20 62 74 72 65 65 5f 63 6c 6f 73 65 5f  }.  btree_close_
1040: 63 75 72 73 6f 72 20 24 63 75 72 73 6f 72 0a 20  cursor $cursor. 
1050: 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 61   if {[llength [a
1060: 72 72 61 79 20 6e 61 6d 65 73 20 73 65 65 6e 5d  rray names seen]
1070: 5d 3d 3d 30 7d 20 7b 0a 20 20 20 20 73 65 74 20  ]==0} {.    set 
1080: 6c 65 61 66 5f 70 61 67 65 73 20 31 0a 20 20 20  leaf_pages 1.   
1090: 20 73 65 74 20 75 6e 75 73 65 64 5f 6c 65 61 66   set unused_leaf
10a0: 20 5b 65 78 70 72 20 7b 24 70 61 67 65 53 69 7a   [expr {$pageSiz
10b0: 65 2d 38 7d 5d 0a 20 20 7d 20 65 6c 73 65 69 66  e-8}].  } elseif
10c0: 20 7b 24 72 6f 6f 74 70 61 67 65 3d 3d 31 20 26   {$rootpage==1 &
10d0: 26 20 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  & ![info exists 
10e0: 73 65 65 6e 28 31 29 5d 7d 20 7b 0a 20 20 20 20  seen(1)]} {.    
10f0: 69 6e 63 72 20 69 6e 74 5f 70 61 67 65 73 0a 20  incr int_pages. 
1100: 20 20 20 69 6e 63 72 20 75 6e 75 73 65 64 5f 69     incr unused_i
1110: 6e 74 20 5b 65 78 70 72 20 7b 24 70 61 67 65 53  nt [expr {$pageS
1120: 69 7a 65 2d 31 31 32 7d 5d 0a 20 20 7d 0a 20 20  ize-112}].  }.  
1130: 73 65 74 20 73 71 6c 20 22 49 4e 53 45 52 54 20  set sql "INSERT 
1140: 49 4e 54 4f 20 73 70 61 63 65 5f 75 73 65 64 20  INTO space_used 
1150: 56 41 4c 55 45 53 28 22 0a 20 20 61 70 70 65 6e  VALUES(".  appen
1160: 64 20 73 71 6c 20 5b 71 75 6f 74 65 20 24 6e 61  d sql [quote $na
1170: 6d 65 5d 0a 20 20 61 70 70 65 6e 64 20 73 71 6c  me].  append sql
1180: 20 22 2c 5b 71 75 6f 74 65 20 24 6e 61 6d 65 5d   ",[quote $name]
1190: 22 0a 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22  ".  append sql "
11a0: 2c 30 22 0a 20 20 61 70 70 65 6e 64 20 73 71 6c  ,0".  append sql
11b0: 20 22 2c 5b 65 78 70 72 20 7b 24 63 6e 74 5f 6c   ",[expr {$cnt_l
11c0: 65 61 66 5f 65 6e 74 72 79 2b 24 63 6e 74 5f 69  eaf_entry+$cnt_i
11d0: 6e 74 5f 65 6e 74 72 79 7d 5d 22 0a 20 20 61 70  nt_entry}]".  ap
11e0: 70 65 6e 64 20 73 71 6c 20 22 2c 24 63 6e 74 5f  pend sql ",$cnt_
11f0: 6c 65 61 66 5f 65 6e 74 72 79 22 0a 20 20 61 70  leaf_entry".  ap
1200: 70 65 6e 64 20 73 71 6c 20 22 2c 24 74 6f 74 61  pend sql ",$tota
1210: 6c 5f 70 61 79 6c 6f 61 64 22 0a 20 20 61 70 70  l_payload".  app
1220: 65 6e 64 20 73 71 6c 20 22 2c 24 74 6f 74 61 6c  end sql ",$total
1230: 5f 6f 76 66 6c 22 0a 20 20 61 70 70 65 6e 64 20  _ovfl".  append 
1240: 73 71 6c 20 22 2c 24 63 6e 74 5f 6f 76 66 6c 22  sql ",$cnt_ovfl"
1250: 0a 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22 2c  .  append sql ",
1260: 24 6d 78 5f 70 61 79 6c 6f 61 64 22 0a 20 20 61  $mx_payload".  a
1270: 70 70 65 6e 64 20 73 71 6c 20 22 2c 24 69 6e 74  ppend sql ",$int
1280: 5f 70 61 67 65 73 22 0a 20 20 61 70 70 65 6e 64  _pages".  append
1290: 20 73 71 6c 20 22 2c 24 6c 65 61 66 5f 70 61 67   sql ",$leaf_pag
12a0: 65 73 22 0a 20 20 61 70 70 65 6e 64 20 73 71 6c  es".  append sql
12b0: 20 22 2c 24 6f 76 66 6c 5f 70 61 67 65 73 22 0a   ",$ovfl_pages".
12c0: 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22 2c 24    append sql ",$
12d0: 75 6e 75 73 65 64 5f 69 6e 74 22 0a 20 20 61 70  unused_int".  ap
12e0: 70 65 6e 64 20 73 71 6c 20 22 2c 24 75 6e 75 73  pend sql ",$unus
12f0: 65 64 5f 6c 65 61 66 22 0a 20 20 61 70 70 65 6e  ed_leaf".  appen
1300: 64 20 73 71 6c 20 22 2c 24 75 6e 75 73 65 64 5f  d sql ",$unused_
1310: 6f 76 66 6c 22 0a 20 20 61 70 70 65 6e 64 20 73  ovfl".  append s
1320: 71 6c 20 29 3b 0a 20 20 6d 65 6d 20 65 76 61 6c  ql );.  mem eval
1330: 20 24 73 71 6c 0a 7d 0a 0a 23 20 54 68 69 73 20   $sql.}..# This 
1340: 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 75 73  query will be us
1350: 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 72  ed to find the r
1360: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
1370: 66 6f 72 20 65 76 65 72 79 20 69 6e 64 65 78 0a  for every index.
1380: 23 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  # in the databas
1390: 65 2e 0a 23 0a 73 65 74 20 73 71 6c 20 7b 0a 20  e..#.set sql {. 
13a0: 20 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 62   SELECT name, tb
13b0: 6c 5f 6e 61 6d 65 2c 20 72 6f 6f 74 70 61 67 65  l_name, rootpage
13c0: 20 0a 20 20 20 20 46 52 4f 4d 20 73 71 6c 69 74   .    FROM sqlit
13d0: 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74  e_master WHERE t
13e0: 79 70 65 3d 27 69 6e 64 65 78 27 0a 20 20 4f 52  ype='index'.  OR
13f0: 44 45 52 20 42 59 20 32 2c 20 31 0a 7d 0a 0a 23  DER BY 2, 1.}..#
1400: 20 41 6e 61 6c 79 7a 65 20 65 76 65 72 79 20 69   Analyze every i
1410: 6e 64 65 78 20 69 6e 20 74 68 65 20 64 61 74 61  ndex in the data
1420: 62 61 73 65 2c 20 6f 6e 65 20 61 74 20 61 20 74  base, one at a t
1430: 69 6d 65 2e 0a 23 0a 73 65 74 20 70 61 67 65 53  ime..#.set pageS
1440: 69 7a 65 20 5b 64 62 20 65 76 61 6c 20 7b 50 52  ize [db eval {PR
1450: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 7d 5d  AGMA page_size}]
1460: 0a 66 6f 72 65 61 63 68 20 7b 6e 61 6d 65 20 74  .foreach {name t
1470: 62 6c 5f 6e 61 6d 65 20 72 6f 6f 74 70 61 67 65  bl_name rootpage
1480: 7d 20 5b 64 62 20 65 76 61 6c 20 24 73 71 6c 5d  } [db eval $sql]
1490: 20 7b 0a 20 20 70 75 74 73 20 73 74 64 65 72 72   {.  puts stderr
14a0: 20 22 41 6e 61 6c 79 7a 69 6e 67 20 69 6e 64 65   "Analyzing inde
14b0: 78 20 24 6e 61 6d 65 20 6f 66 20 74 61 62 6c 65  x $name of table
14c0: 20 24 74 62 6c 5f 6e 61 6d 65 2e 2e 2e 22 0a 20   $tbl_name...". 
14d0: 20 73 65 74 20 63 75 72 73 6f 72 20 5b 62 74 72   set cursor [btr
14e0: 65 65 5f 63 75 72 73 6f 72 20 24 44 42 20 24 72  ee_cursor $DB $r
14f0: 6f 6f 74 70 61 67 65 20 30 5d 0a 20 20 73 65 74  ootpage 0].  set
1500: 20 67 6f 20 5b 62 74 72 65 65 5f 66 69 72 73 74   go [btree_first
1510: 20 24 63 75 72 73 6f 72 5d 0a 20 20 63 61 74 63   $cursor].  catc
1520: 68 20 7b 75 6e 73 65 74 20 73 65 65 6e 7d 0a 20  h {unset seen}. 
1530: 20 73 65 74 20 74 6f 74 61 6c 5f 70 61 79 6c 6f   set total_paylo
1540: 61 64 20 30 20 20 20 20 20 20 20 20 3b 23 20 50  ad 0        ;# P
1550: 61 79 6c 6f 61 64 20 73 70 61 63 65 20 75 73 65  ayload space use
1560: 64 20 62 79 20 61 6c 6c 20 65 6e 74 72 69 65 73  d by all entries
1570: 0a 20 20 73 65 74 20 74 6f 74 61 6c 5f 6f 76 66  .  set total_ovf
1580: 6c 20 30 20 20 20 20 20 20 20 20 20 20 20 3b 23  l 0           ;#
1590: 20 50 61 79 6c 6f 61 64 20 73 70 61 63 65 20 6f   Payload space o
15a0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  n overflow pages
15b0: 0a 20 20 73 65 74 20 75 6e 75 73 65 64 5f 6c 65  .  set unused_le
15c0: 61 66 20 30 20 20 20 20 20 20 20 20 20 20 3b 23  af 0          ;#
15d0: 20 55 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   Unused space on
15e0: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 20 20 73 65   leaf nodes.  se
15f0: 74 20 75 6e 75 73 65 64 5f 6f 76 66 6c 20 30 20  t unused_ovfl 0 
1600: 20 20 20 20 20 20 20 20 20 3b 23 20 55 6e 75 73           ;# Unus
1610: 65 64 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ed space on over
1620: 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 73 65 74  flow pages.  set
1630: 20 63 6e 74 5f 6f 76 66 6c 20 30 20 20 20 20 20   cnt_ovfl 0     
1640: 20 20 20 20 20 20 20 20 3b 23 20 4e 75 6d 62 65          ;# Numbe
1650: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 68 61  r of entries tha
1660: 74 20 75 73 65 20 6f 76 65 72 66 6c 6f 77 73 0a  t use overflows.
1670: 20 20 73 65 74 20 63 6e 74 5f 6c 65 61 66 5f 65    set cnt_leaf_e
1680: 6e 74 72 79 20 30 20 20 20 20 20 20 20 3b 23 20  ntry 0       ;# 
1690: 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 65  Number of leaf e
16a0: 6e 74 72 69 65 73 0a 20 20 73 65 74 20 6d 78 5f  ntries.  set mx_
16b0: 70 61 79 6c 6f 61 64 20 30 20 20 20 20 20 20 20  payload 0       
16c0: 20 20 20 20 3b 23 20 4d 61 78 69 6d 75 6d 20 70      ;# Maximum p
16d0: 61 79 6c 6f 61 64 20 73 69 7a 65 0a 20 20 73 65  ayload size.  se
16e0: 74 20 6f 76 66 6c 5f 70 61 67 65 73 20 30 20 20  t ovfl_pages 0  
16f0: 20 20 20 20 20 20 20 20 20 3b 23 20 4e 75 6d 62           ;# Numb
1700: 65 72 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  er of overflow p
1710: 61 67 65 73 20 75 73 65 64 0a 20 20 73 65 74 20  ages used.  set 
1720: 6c 65 61 66 5f 70 61 67 65 73 20 30 20 20 20 20  leaf_pages 0    
1730: 20 20 20 20 20 20 20 3b 23 20 4e 75 6d 62 65 72         ;# Number
1740: 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 0a 20   of leaf pages. 
1750: 20 77 68 69 6c 65 20 7b 24 67 6f 3d 3d 30 7d 20   while {$go==0} 
1760: 7b 0a 20 20 20 20 69 6e 63 72 20 63 6e 74 5f 6c  {.    incr cnt_l
1770: 65 61 66 5f 65 6e 74 72 79 0a 20 20 20 20 73 65  eaf_entry.    se
1780: 74 20 73 74 61 74 20 5b 62 74 72 65 65 5f 63 75  t stat [btree_cu
1790: 72 73 6f 72 5f 69 6e 66 6f 20 24 63 75 72 73 6f  rsor_info $curso
17a0: 72 5d 0a 20 20 20 20 73 65 74 20 70 61 79 6c 6f  r].    set paylo
17b0: 61 64 20 5b 62 74 72 65 65 5f 6b 65 79 73 69 7a  ad [btree_keysiz
17c0: 65 20 24 63 75 72 73 6f 72 5d 0a 20 20 20 20 69  e $cursor].    i
17d0: 66 20 7b 24 70 61 79 6c 6f 61 64 3e 24 6d 78 5f  f {$payload>$mx_
17e0: 70 61 79 6c 6f 61 64 7d 20 7b 73 65 74 20 6d 78  payload} {set mx
17f0: 5f 70 61 79 6c 6f 61 64 20 24 70 61 79 6c 6f 61  _payload $payloa
1800: 64 7d 0a 20 20 20 20 69 6e 63 72 20 74 6f 74 61  d}.    incr tota
1810: 6c 5f 70 61 79 6c 6f 61 64 20 24 70 61 79 6c 6f  l_payload $paylo
1820: 61 64 0a 20 20 20 20 73 65 74 20 6c 6f 63 61 6c  ad.    set local
1830: 20 5b 6c 69 6e 64 65 78 20 24 73 74 61 74 20 38   [lindex $stat 8
1840: 5d 20 20 20 20 0a 20 20 20 20 73 65 74 20 6f 76  ]    .    set ov
1850: 66 6c 20 5b 65 78 70 72 20 7b 24 70 61 79 6c 6f  fl [expr {$paylo
1860: 61 64 2d 24 6c 6f 63 61 6c 7d 5d 0a 20 20 20 20  ad-$local}].    
1870: 69 66 20 7b 24 6f 76 66 6c 7d 20 7b 0a 20 20 20  if {$ovfl} {.   
1880: 20 20 20 69 6e 63 72 20 63 6e 74 5f 6f 76 66 6c     incr cnt_ovfl
1890: 0a 20 20 20 20 20 20 69 6e 63 72 20 74 6f 74 61  .      incr tota
18a0: 6c 5f 6f 76 66 6c 20 24 6f 76 66 6c 0a 20 20 20  l_ovfl $ovfl.   
18b0: 20 20 20 73 65 74 20 6e 20 5b 65 78 70 72 20 7b     set n [expr {
18c0: 69 6e 74 28 63 65 69 6c 28 24 6f 76 66 6c 2f 28  int(ceil($ovfl/(
18d0: 24 70 61 67 65 53 69 7a 65 2d 34 2e 30 29 29 29  $pageSize-4.0)))
18e0: 7d 5d 0a 20 20 20 20 20 20 69 6e 63 72 20 6f 76  }].      incr ov
18f0: 66 6c 5f 70 61 67 65 73 20 24 6e 0a 20 20 20 20  fl_pages $n.    
1900: 20 20 69 6e 63 72 20 75 6e 75 73 65 64 5f 6f 76    incr unused_ov
1910: 66 6c 20 5b 65 78 70 72 20 7b 24 6e 2a 28 24 70  fl [expr {$n*($p
1920: 61 67 65 53 69 7a 65 2d 34 29 20 2d 20 24 6f 76  ageSize-4) - $ov
1930: 66 6c 7d 5d 0a 20 20 20 20 7d 0a 20 20 20 20 73  fl}].    }.    s
1940: 65 74 20 70 67 6e 6f 20 5b 6c 69 6e 64 65 78 20  et pgno [lindex 
1950: 24 73 74 61 74 20 30 5d 0a 20 20 20 20 69 66 20  $stat 0].    if 
1960: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 73  {![info exists s
1970: 65 65 6e 28 24 70 67 6e 6f 29 5d 7d 20 7b 0a 20  een($pgno)]} {. 
1980: 20 20 20 20 20 73 65 74 20 73 65 65 6e 28 24 70       set seen($p
1990: 67 6e 6f 29 20 31 0a 20 20 20 20 20 20 69 6e 63  gno) 1.      inc
19a0: 72 20 6c 65 61 66 5f 70 61 67 65 73 0a 20 20 20  r leaf_pages.   
19b0: 20 20 20 69 6e 63 72 20 75 6e 75 73 65 64 5f 6c     incr unused_l
19c0: 65 61 66 20 5b 6c 69 6e 64 65 78 20 24 73 74 61  eaf [lindex $sta
19d0: 74 20 34 5d 0a 20 20 20 20 7d 0a 20 20 20 20 73  t 4].    }.    s
19e0: 65 74 20 67 6f 20 5b 62 74 72 65 65 5f 6e 65 78  et go [btree_nex
19f0: 74 20 24 63 75 72 73 6f 72 5d 0a 20 20 7d 0a 20  t $cursor].  }. 
1a00: 20 62 74 72 65 65 5f 63 6c 6f 73 65 5f 63 75 72   btree_close_cur
1a10: 73 6f 72 20 24 63 75 72 73 6f 72 0a 20 20 69 66  sor $cursor.  if
1a20: 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b 61 72 72 61   {[llength [arra
1a30: 79 20 6e 61 6d 65 73 20 73 65 65 6e 5d 5d 3d 3d  y names seen]]==
1a40: 30 7d 20 7b 0a 20 20 20 20 73 65 74 20 6c 65 61  0} {.    set lea
1a50: 66 5f 70 61 67 65 73 20 31 0a 20 20 20 20 73 65  f_pages 1.    se
1a60: 74 20 75 6e 75 73 65 64 5f 6c 65 61 66 20 5b 65  t unused_leaf [e
1a70: 78 70 72 20 7b 24 70 61 67 65 53 69 7a 65 2d 38  xpr {$pageSize-8
1a80: 7d 5d 0a 20 20 7d 0a 20 20 73 65 74 20 73 71 6c  }].  }.  set sql
1a90: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 70   "INSERT INTO sp
1aa0: 61 63 65 5f 75 73 65 64 20 56 41 4c 55 45 53 28  ace_used VALUES(
1ab0: 22 0a 20 20 61 70 70 65 6e 64 20 73 71 6c 20 5b  ".  append sql [
1ac0: 71 75 6f 74 65 20 24 6e 61 6d 65 5d 0a 20 20 61  quote $name].  a
1ad0: 70 70 65 6e 64 20 73 71 6c 20 22 2c 5b 71 75 6f  ppend sql ",[quo
1ae0: 74 65 20 24 74 62 6c 5f 6e 61 6d 65 5d 22 0a 20  te $tbl_name]". 
1af0: 20 61 70 70 65 6e 64 20 73 71 6c 20 22 2c 31 22   append sql ",1"
1b00: 0a 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22 2c  .  append sql ",
1b10: 24 63 6e 74 5f 6c 65 61 66 5f 65 6e 74 72 79 22  $cnt_leaf_entry"
1b20: 0a 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22 2c  .  append sql ",
1b30: 24 63 6e 74 5f 6c 65 61 66 5f 65 6e 74 72 79 22  $cnt_leaf_entry"
1b40: 0a 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22 2c  .  append sql ",
1b50: 24 74 6f 74 61 6c 5f 70 61 79 6c 6f 61 64 22 0a  $total_payload".
1b60: 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22 2c 24    append sql ",$
1b70: 74 6f 74 61 6c 5f 6f 76 66 6c 22 0a 20 20 61 70  total_ovfl".  ap
1b80: 70 65 6e 64 20 73 71 6c 20 22 2c 24 63 6e 74 5f  pend sql ",$cnt_
1b90: 6f 76 66 6c 22 0a 20 20 61 70 70 65 6e 64 20 73  ovfl".  append s
1ba0: 71 6c 20 22 2c 24 6d 78 5f 70 61 79 6c 6f 61 64  ql ",$mx_payload
1bb0: 22 0a 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22  ".  append sql "
1bc0: 2c 30 22 0a 20 20 61 70 70 65 6e 64 20 73 71 6c  ,0".  append sql
1bd0: 20 22 2c 24 6c 65 61 66 5f 70 61 67 65 73 22 0a   ",$leaf_pages".
1be0: 20 20 61 70 70 65 6e 64 20 73 71 6c 20 22 2c 24    append sql ",$
1bf0: 6f 76 66 6c 5f 70 61 67 65 73 22 0a 20 20 61 70  ovfl_pages".  ap
1c00: 70 65 6e 64 20 73 71 6c 20 22 2c 30 22 0a 20 20  pend sql ",0".  
1c10: 61 70 70 65 6e 64 20 73 71 6c 20 22 2c 24 75 6e  append sql ",$un
1c20: 75 73 65 64 5f 6c 65 61 66 22 0a 20 20 61 70 70  used_leaf".  app
1c30: 65 6e 64 20 73 71 6c 20 22 2c 24 75 6e 75 73 65  end sql ",$unuse
1c40: 64 5f 6f 76 66 6c 22 0a 20 20 61 70 70 65 6e 64  d_ovfl".  append
1c50: 20 73 71 6c 20 29 3b 0a 20 20 6d 65 6d 20 65 76   sql );.  mem ev
1c60: 61 6c 20 24 73 71 6c 0a 7d 0a 0a 23 20 47 65 6e  al $sql.}..# Gen
1c70: 65 72 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6c  erate a single l
1c80: 69 6e 65 20 6f 66 20 6f 75 74 70 75 74 20 69 6e  ine of output in
1c90: 20 74 68 65 20 73 74 61 74 69 73 74 69 63 73 20   the statistics 
1ca0: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 0a 23  section of the.#
1cb0: 20 72 65 70 6f 72 74 2e 0a 23 0a 70 72 6f 63 20   report..#.proc 
1cc0: 73 74 61 74 6c 69 6e 65 20 7b 74 69 74 6c 65 20  statline {title 
1cd0: 76 61 6c 75 65 20 7b 65 78 74 72 61 20 7b 7d 7d  value {extra {}}
1ce0: 7d 20 7b 0a 20 20 73 65 74 20 6c 65 6e 20 5b 73  } {.  set len [s
1cf0: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 74 69  tring length $ti
1d00: 74 6c 65 5d 0a 20 20 73 65 74 20 64 6f 74 73 20  tle].  set dots 
1d10: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 7b 2e  [string range {.
1d20: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1d30: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1d40: 2e 2e 2e 2e 2e 7d 20 24 6c 65 6e 20 65 6e 64 5d  .....} $len end]
1d50: 0a 20 20 73 65 74 20 6c 65 6e 20 5b 73 74 72 69  .  set len [stri
1d60: 6e 67 20 6c 65 6e 67 74 68 20 24 76 61 6c 75 65  ng length $value
1d70: 5d 0a 20 20 73 65 74 20 73 70 32 20 5b 73 74 72  ].  set sp2 [str
1d80: 69 6e 67 20 72 61 6e 67 65 20 7b 20 20 20 20 20  ing range {     
1d90: 20 20 20 20 20 7d 20 24 6c 65 6e 20 65 6e 64 5d       } $len end]
1da0: 0a 20 20 69 66 20 7b 24 65 78 74 72 61 20 6e 65  .  if {$extra ne
1db0: 20 22 22 7d 20 7b 0a 20 20 20 20 73 65 74 20 65   ""} {.    set e
1dc0: 78 74 72 61 20 22 20 24 65 78 74 72 61 22 0a 20  xtra " $extra". 
1dd0: 20 7d 0a 20 20 70 75 74 73 20 22 24 74 69 74 6c   }.  puts "$titl
1de0: 65 24 64 6f 74 73 20 24 76 61 6c 75 65 24 73 70  e$dots $value$sp
1df0: 32 24 65 78 74 72 61 22 0a 7d 0a 0a 23 20 47 65  2$extra".}..# Ge
1e00: 6e 65 72 61 74 65 20 61 20 66 6f 72 6d 61 74 74  nerate a formatt
1e10: 65 64 20 70 65 72 63 65 6e 74 61 67 65 20 76 61  ed percentage va
1e20: 6c 75 65 20 66 6f 72 20 24 6e 75 6d 2f 24 64 65  lue for $num/$de
1e30: 6e 6f 6d 0a 23 0a 70 72 6f 63 20 70 65 72 63 65  nom.#.proc perce
1e40: 6e 74 20 7b 6e 75 6d 20 64 65 6e 6f 6d 20 7b 6f  nt {num denom {o
1e50: 66 20 7b 7d 7d 7d 20 7b 0a 20 20 69 66 20 7b 24  f {}}} {.  if {$
1e60: 64 65 6e 6f 6d 3d 3d 30 2e 30 7d 20 7b 72 65 74  denom==0.0} {ret
1e70: 75 72 6e 20 22 22 7d 0a 20 20 73 65 74 20 76 20  urn ""}.  set v 
1e80: 5b 65 78 70 72 20 7b 24 6e 75 6d 2a 31 30 30 2e  [expr {$num*100.
1e90: 30 2f 24 64 65 6e 6f 6d 7d 5d 0a 20 20 73 65 74  0/$denom}].  set
1ea0: 20 6f 66 20 7b 7d 0a 20 20 69 66 20 7b 24 76 3d   of {}.  if {$v=
1eb0: 3d 31 2e 30 20 7c 7c 20 24 76 3d 3d 30 2e 30 20  =1.0 || $v==0.0 
1ec0: 7c 7c 20 28 24 76 3e 31 2e 30 20 26 26 20 24 76  || ($v>1.0 && $v
1ed0: 3c 39 39 2e 30 29 7d 20 7b 0a 20 20 20 20 72 65  <99.0)} {.    re
1ee0: 74 75 72 6e 20 5b 66 6f 72 6d 61 74 20 7b 25 35  turn [format {%5
1ef0: 2e 31 66 25 25 20 25 73 7d 20 24 76 20 24 6f 66  .1f%% %s} $v $of
1f00: 5d 0a 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 76  ].  } elseif {$v
1f10: 3c 30 2e 31 20 7c 7c 20 24 76 3e 39 39 2e 39 7d  <0.1 || $v>99.9}
1f20: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 66   {.    return [f
1f30: 6f 72 6d 61 74 20 7b 25 37 2e 33 66 25 25 20 25  ormat {%7.3f%% %
1f40: 73 7d 20 24 76 20 24 6f 66 5d 0a 20 20 7d 20 65  s} $v $of].  } e
1f50: 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
1f60: 20 5b 66 6f 72 6d 61 74 20 7b 25 36 2e 32 66 25   [format {%6.2f%
1f70: 25 20 25 73 7d 20 24 76 20 24 6f 66 5d 0a 20 20  % %s} $v $of].  
1f80: 7d 0a 7d 0a 0a 23 20 47 65 6e 65 72 61 74 65 20  }.}..# Generate 
1f90: 61 20 73 75 62 72 65 70 6f 72 74 20 74 68 61 74  a subreport that
1fa0: 20 63 6f 76 65 72 73 20 73 6f 6d 65 20 73 75 62   covers some sub
1fb0: 73 65 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  set of the datab
1fc0: 61 73 65 2e 0a 23 20 74 68 65 20 24 77 68 65 72  ase..# the $wher
1fd0: 65 20 63 6c 61 75 73 65 20 64 65 74 65 72 6d 69  e clause determi
1fe0: 6e 65 73 20 77 68 69 63 68 20 73 75 62 73 65 74  nes which subset
1ff0: 20 74 6f 20 61 6e 61 6c 79 7a 65 2e 0a 23 0a 70   to analyze..#.p
2000: 72 6f 63 20 73 75 62 72 65 70 6f 72 74 20 7b 74  roc subreport {t
2010: 69 74 6c 65 20 77 68 65 72 65 7d 20 7b 0a 20 20  itle where} {.  
2020: 67 6c 6f 62 61 6c 20 70 61 67 65 53 69 7a 65 0a  global pageSize.
2030: 20 20 73 65 74 20 68 69 74 20 30 0a 20 20 6d 65    set hit 0.  me
2040: 6d 20 65 76 61 6c 20 22 0a 20 20 20 20 53 45 4c  m eval ".    SEL
2050: 45 43 54 0a 20 20 20 20 20 20 73 75 6d 28 6e 65  ECT.      sum(ne
2060: 6e 74 72 79 29 20 41 53 20 6e 65 6e 74 72 79 2c  ntry) AS nentry,
2070: 0a 20 20 20 20 20 20 73 75 6d 28 6c 65 61 66 5f  .      sum(leaf_
2080: 65 6e 74 72 69 65 73 29 20 41 53 20 6e 6c 65 61  entries) AS nlea
2090: 66 2c 0a 20 20 20 20 20 20 73 75 6d 28 70 61 79  f,.      sum(pay
20a0: 6c 6f 61 64 29 20 41 53 20 70 61 79 6c 6f 61 64  load) AS payload
20b0: 2c 0a 20 20 20 20 20 20 73 75 6d 28 6f 76 66 6c  ,.      sum(ovfl
20c0: 5f 70 61 79 6c 6f 61 64 29 20 41 53 20 6f 76 66  _payload) AS ovf
20d0: 6c 5f 70 61 79 6c 6f 61 64 2c 0a 20 20 20 20 20  l_payload,.     
20e0: 20 6d 61 78 28 6d 78 5f 70 61 79 6c 6f 61 64 29   max(mx_payload)
20f0: 20 41 53 20 6d 78 5f 70 61 79 6c 6f 61 64 2c 0a   AS mx_payload,.
2100: 20 20 20 20 20 20 73 75 6d 28 6f 76 66 6c 5f 63        sum(ovfl_c
2110: 6e 74 29 20 61 73 20 6f 76 66 6c 5f 63 6e 74 2c  nt) as ovfl_cnt,
2120: 0a 20 20 20 20 20 20 73 75 6d 28 6c 65 61 66 5f  .      sum(leaf_
2130: 70 61 67 65 73 29 20 41 53 20 6c 65 61 66 5f 70  pages) AS leaf_p
2140: 61 67 65 73 2c 0a 20 20 20 20 20 20 73 75 6d 28  ages,.      sum(
2150: 69 6e 74 5f 70 61 67 65 73 29 20 41 53 20 69 6e  int_pages) AS in
2160: 74 5f 70 61 67 65 73 2c 0a 20 20 20 20 20 20 73  t_pages,.      s
2170: 75 6d 28 6f 76 66 6c 5f 70 61 67 65 73 29 20 41  um(ovfl_pages) A
2180: 53 20 6f 76 66 6c 5f 70 61 67 65 73 2c 0a 20 20  S ovfl_pages,.  
2190: 20 20 20 20 73 75 6d 28 6c 65 61 66 5f 75 6e 75      sum(leaf_unu
21a0: 73 65 64 29 20 41 53 20 6c 65 61 66 5f 75 6e 75  sed) AS leaf_unu
21b0: 73 65 64 2c 0a 20 20 20 20 20 20 73 75 6d 28 69  sed,.      sum(i
21c0: 6e 74 5f 75 6e 75 73 65 64 29 20 41 53 20 69 6e  nt_unused) AS in
21d0: 74 5f 75 6e 75 73 65 64 2c 0a 20 20 20 20 20 20  t_unused,.      
21e0: 73 75 6d 28 6f 76 66 6c 5f 75 6e 75 73 65 64 29  sum(ovfl_unused)
21f0: 20 41 53 20 6f 76 66 6c 5f 75 6e 75 73 65 64 0a   AS ovfl_unused.
2200: 20 20 20 20 46 52 4f 4d 20 73 70 61 63 65 5f 75      FROM space_u
2210: 73 65 64 20 57 48 45 52 45 20 24 77 68 65 72 65  sed WHERE $where
2220: 22 20 7b 7d 20 7b 73 65 74 20 68 69 74 20 31 7d  " {} {set hit 1}
2230: 0a 20 20 69 66 20 7b 21 24 68 69 74 7d 20 7b 72  .  if {!$hit} {r
2240: 65 74 75 72 6e 20 30 7d 0a 20 20 70 75 74 73 20  eturn 0}.  puts 
2250: 22 22 0a 20 20 73 65 74 20 6c 65 6e 20 5b 73 74  "".  set len [st
2260: 72 69 6e 67 20 6c 65 6e 67 74 68 20 24 74 69 74  ring length $tit
2270: 6c 65 5d 0a 20 20 69 6e 63 72 20 6c 65 6e 20 35  le].  incr len 5
2280: 0a 20 20 73 65 74 20 73 74 61 72 73 20 22 2a 2a  .  set stars "**
2290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22b0: 2a 22 0a 20 20 61 70 70 65 6e 64 20 73 74 61 72  *".  append star
22c0: 73 20 24 73 74 61 72 73 0a 20 20 73 65 74 20 73  s $stars.  set s
22d0: 74 61 72 73 20 5b 73 74 72 69 6e 67 20 72 61 6e  tars [string ran
22e0: 67 65 20 24 73 74 61 72 73 20 24 6c 65 6e 20 65  ge $stars $len e
22f0: 6e 64 5d 0a 20 20 70 75 74 73 20 22 2a 2a 2a 20  nd].  puts "*** 
2300: 24 74 69 74 6c 65 20 24 73 74 61 72 73 22 0a 20  $title $stars". 
2310: 20 70 75 74 73 20 22 22 0a 20 20 73 65 74 20 74   puts "".  set t
2320: 6f 74 61 6c 5f 70 61 67 65 73 20 5b 65 78 70 72  otal_pages [expr
2330: 20 7b 24 6c 65 61 66 5f 70 61 67 65 73 2b 24 69   {$leaf_pages+$i
2340: 6e 74 5f 70 61 67 65 73 2b 24 6f 76 66 6c 5f 70  nt_pages+$ovfl_p
2350: 61 67 65 73 7d 5d 0a 20 20 73 74 61 74 6c 69 6e  ages}].  statlin
2360: 65 20 22 50 65 72 63 65 6e 74 61 67 65 20 6f 66  e "Percentage of
2370: 20 74 6f 74 61 6c 20 64 61 74 61 62 61 73 65 22   total database"
2380: 20 5b 70 65 72 63 65 6e 74 20 24 74 6f 74 61 6c   [percent $total
2390: 5f 70 61 67 65 73 20 24 3a 3a 66 69 6c 65 5f 70  _pages $::file_p
23a0: 67 63 6e 74 5d 0a 20 20 73 74 61 74 6c 69 6e 65  gcnt].  statline
23b0: 20 22 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72   "Number of entr
23c0: 69 65 73 22 20 24 6e 6c 65 61 66 0a 20 20 73 65  ies" $nleaf.  se
23d0: 74 20 74 6f 74 61 6c 5f 75 6e 75 73 65 64 20 5b  t total_unused [
23e0: 65 78 70 72 20 7b 24 6f 76 66 6c 5f 75 6e 75 73  expr {$ovfl_unus
23f0: 65 64 2b 24 69 6e 74 5f 75 6e 75 73 65 64 2b 24  ed+$int_unused+$
2400: 6c 65 61 66 5f 75 6e 75 73 65 64 7d 5d 0a 20 20  leaf_unused}].  
2410: 73 65 74 20 73 74 6f 72 61 67 65 20 5b 65 78 70  set storage [exp
2420: 72 20 7b 24 74 6f 74 61 6c 5f 70 61 67 65 73 2a  r {$total_pages*
2430: 24 70 61 67 65 53 69 7a 65 7d 5d 0a 20 20 73 74  $pageSize}].  st
2440: 61 74 6c 69 6e 65 20 22 42 79 74 65 73 20 6f 66  atline "Bytes of
2450: 20 73 74 6f 72 61 67 65 20 63 6f 6e 73 75 6d 65   storage consume
2460: 64 22 20 24 73 74 6f 72 61 67 65 0a 20 20 73 74  d" $storage.  st
2470: 61 74 6c 69 6e 65 20 22 42 79 74 65 73 20 6f 66  atline "Bytes of
2480: 20 70 61 79 6c 6f 61 64 22 20 24 70 61 79 6c 6f   payload" $paylo
2490: 61 64 20 5c 0a 20 20 20 20 20 20 20 5b 70 65 72  ad \.       [per
24a0: 63 65 6e 74 20 24 70 61 79 6c 6f 61 64 20 24 73  cent $payload $s
24b0: 74 6f 72 61 67 65 20 7b 6f 66 20 73 74 6f 72 61  torage {of stora
24c0: 67 65 20 63 6f 6e 73 75 6d 65 64 7d 5d 0a 20 20  ge consumed}].  
24d0: 73 74 61 74 6c 69 6e 65 20 22 41 76 65 72 61 67  statline "Averag
24e0: 65 20 70 61 79 6c 6f 61 64 20 70 65 72 20 65 6e  e payload per en
24f0: 74 72 79 22 20 5b 65 78 70 72 20 7b 24 6e 6c 65  try" [expr {$nle
2500: 61 66 3e 30 3f 24 70 61 79 6c 6f 61 64 2f 24 6e  af>0?$payload/$n
2510: 6c 65 61 66 3a 30 7d 5d 0a 20 20 73 65 74 20 61  leaf:0}].  set a
2520: 76 67 75 6e 75 73 65 64 20 5b 65 78 70 72 20 7b  vgunused [expr {
2530: 24 6e 6c 65 61 66 3e 30 3f 24 74 6f 74 61 6c 5f  $nleaf>0?$total_
2540: 75 6e 75 73 65 64 2f 24 6e 6c 65 61 66 3a 30 7d  unused/$nleaf:0}
2550: 5d 0a 20 20 73 74 61 74 6c 69 6e 65 20 22 41 76  ].  statline "Av
2560: 65 72 61 67 65 20 75 6e 75 73 65 64 20 62 79 74  erage unused byt
2570: 65 73 20 70 65 72 20 65 6e 74 72 79 22 20 24 61  es per entry" $a
2580: 76 67 75 6e 75 73 65 64 0a 20 20 73 65 74 20 6e  vgunused.  set n
2590: 69 6e 74 20 5b 65 78 70 72 20 7b 24 6e 65 6e 74  int [expr {$nent
25a0: 72 79 2d 24 6e 6c 65 61 66 7d 5d 0a 20 20 69 66  ry-$nleaf}].  if
25b0: 20 7b 24 69 6e 74 5f 70 61 67 65 73 3e 30 7d 20   {$int_pages>0} 
25c0: 7b 0a 20 20 20 20 73 74 61 74 6c 69 6e 65 20 22  {.    statline "
25d0: 41 76 65 72 61 67 65 20 66 61 6e 6f 75 74 22 20  Average fanout" 
25e0: 5b 66 6f 72 6d 61 74 20 25 2e 32 66 20 5b 65 78  [format %.2f [ex
25f0: 70 72 20 7b 28 24 6e 69 6e 74 2b 30 2e 30 29 2f  pr {($nint+0.0)/
2600: 24 69 6e 74 5f 70 61 67 65 73 7d 5d 5d 0a 20 20  $int_pages}]].  
2610: 7d 0a 20 20 73 74 61 74 6c 69 6e 65 20 22 4d 61  }.  statline "Ma
2620: 78 69 6d 75 6d 20 70 61 79 6c 6f 61 64 20 70 65  ximum payload pe
2630: 72 20 65 6e 74 72 79 22 20 24 6d 78 5f 70 61 79  r entry" $mx_pay
2640: 6c 6f 61 64 0a 20 20 73 74 61 74 6c 69 6e 65 20  load.  statline 
2650: 22 45 6e 74 72 69 65 73 20 74 68 61 74 20 75 73  "Entries that us
2660: 65 20 6f 76 65 72 66 6c 6f 77 22 20 24 6f 76 66  e overflow" $ovf
2670: 6c 5f 63 6e 74 20 5c 0a 20 20 20 20 20 20 20 20  l_cnt \.        
2680: 5b 70 65 72 63 65 6e 74 20 24 6f 76 66 6c 5f 63  [percent $ovfl_c
2690: 6e 74 20 24 6e 6c 65 61 66 20 7b 6f 66 20 61 6c  nt $nleaf {of al
26a0: 6c 20 65 6e 74 72 69 65 73 7d 5d 0a 20 20 69 66  l entries}].  if
26b0: 20 7b 24 69 6e 74 5f 70 61 67 65 73 3e 30 7d 20   {$int_pages>0} 
26c0: 7b 0a 20 20 20 20 73 74 61 74 6c 69 6e 65 20 22  {.    statline "
26d0: 49 6e 64 65 78 20 70 61 67 65 73 20 75 73 65 64  Index pages used
26e0: 22 20 24 69 6e 74 5f 70 61 67 65 73 0a 20 20 7d  " $int_pages.  }
26f0: 0a 20 20 73 74 61 74 6c 69 6e 65 20 22 50 72 69  .  statline "Pri
2700: 6d 61 72 79 20 70 61 67 65 73 20 75 73 65 64 22  mary pages used"
2710: 20 24 6c 65 61 66 5f 70 61 67 65 73 0a 20 20 73   $leaf_pages.  s
2720: 74 61 74 6c 69 6e 65 20 22 4f 76 65 72 66 6c 6f  tatline "Overflo
2730: 77 20 70 61 67 65 73 20 75 73 65 64 22 20 24 6f  w pages used" $o
2740: 76 66 6c 5f 70 61 67 65 73 0a 20 20 73 74 61 74  vfl_pages.  stat
2750: 6c 69 6e 65 20 22 54 6f 74 61 6c 20 70 61 67 65  line "Total page
2760: 73 20 75 73 65 64 22 20 24 74 6f 74 61 6c 5f 70  s used" $total_p
2770: 61 67 65 73 0a 20 20 69 66 20 7b 24 69 6e 74 5f  ages.  if {$int_
2780: 75 6e 75 73 65 64 3e 30 7d 20 7b 0a 20 20 20 20  unused>0} {.    
2790: 73 74 61 74 6c 69 6e 65 20 22 55 6e 75 73 65 64  statline "Unused
27a0: 20 62 79 74 65 73 20 6f 6e 20 69 6e 64 65 78 20   bytes on index 
27b0: 70 61 67 65 73 22 20 24 69 6e 74 5f 75 6e 75 73  pages" $int_unus
27c0: 65 64 20 5c 0a 20 20 20 20 20 20 20 20 20 5b 70  ed \.         [p
27d0: 65 72 63 65 6e 74 20 24 69 6e 74 5f 75 6e 75 73  ercent $int_unus
27e0: 65 64 20 5b 65 78 70 72 20 7b 24 69 6e 74 5f 70  ed [expr {$int_p
27f0: 61 67 65 73 2a 24 70 61 67 65 53 69 7a 65 7d 5d  ages*$pageSize}]
2800: 20 7b 6f 66 20 69 6e 64 65 78 20 73 70 61 63 65   {of index space
2810: 7d 5d 0a 20 20 7d 0a 20 20 73 74 61 74 6c 69 6e  }].  }.  statlin
2820: 65 20 22 55 6e 75 73 65 64 20 62 79 74 65 73 20  e "Unused bytes 
2830: 6f 6e 20 70 72 69 6d 61 72 79 20 70 61 67 65 73  on primary pages
2840: 22 20 24 6c 65 61 66 5f 75 6e 75 73 65 64 20 5c  " $leaf_unused \
2850: 0a 20 20 20 20 20 5b 70 65 72 63 65 6e 74 20 24  .     [percent $
2860: 6c 65 61 66 5f 75 6e 75 73 65 64 20 5b 65 78 70  leaf_unused [exp
2870: 72 20 7b 24 6c 65 61 66 5f 70 61 67 65 73 2a 24  r {$leaf_pages*$
2880: 70 61 67 65 53 69 7a 65 7d 5d 20 7b 6f 66 20 70  pageSize}] {of p
2890: 72 69 6d 61 72 79 20 73 70 61 63 65 7d 5d 0a 20  rimary space}]. 
28a0: 20 73 74 61 74 6c 69 6e 65 20 22 55 6e 75 73 65   statline "Unuse
28b0: 64 20 62 79 74 65 73 20 6f 6e 20 6f 76 65 72 66  d bytes on overf
28c0: 6c 6f 77 20 70 61 67 65 73 22 20 24 6f 76 66 6c  low pages" $ovfl
28d0: 5f 75 6e 75 73 65 64 20 5c 0a 20 20 20 20 20 5b  _unused \.     [
28e0: 70 65 72 63 65 6e 74 20 24 6f 76 66 6c 5f 75 6e  percent $ovfl_un
28f0: 75 73 65 64 20 5b 65 78 70 72 20 7b 24 6f 76 66  used [expr {$ovf
2900: 6c 5f 70 61 67 65 73 2a 24 70 61 67 65 53 69 7a  l_pages*$pageSiz
2910: 65 7d 5d 20 7b 6f 66 20 6f 76 65 72 66 6c 6f 77  e}] {of overflow
2920: 20 73 70 61 63 65 7d 5d 0a 20 20 73 74 61 74 6c   space}].  statl
2930: 69 6e 65 20 22 55 6e 75 73 65 64 20 62 79 74 65  ine "Unused byte
2940: 73 20 6f 6e 20 61 6c 6c 20 70 61 67 65 73 22 20  s on all pages" 
2950: 24 74 6f 74 61 6c 5f 75 6e 75 73 65 64 20 5c 0a  $total_unused \.
2960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
2970: 70 65 72 63 65 6e 74 20 24 74 6f 74 61 6c 5f 75  percent $total_u
2980: 6e 75 73 65 64 20 24 73 74 6f 72 61 67 65 20 7b  nused $storage {
2990: 6f 66 20 61 6c 6c 20 73 70 61 63 65 7d 5d 0a 20  of all space}]. 
29a0: 20 72 65 74 75 72 6e 20 31 0a 7d 0a 0a 23 20 43   return 1.}..# C
29b0: 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6f 76 65  alculate the ove
29c0: 72 68 65 61 64 20 69 6e 20 70 61 67 65 73 20 63  rhead in pages c
29d0: 61 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61  aused by auto-va
29e0: 63 75 75 6d 2e 20 0a 23 0a 23 20 54 68 69 73 20  cuum. .#.# This 
29f0: 70 72 6f 63 65 64 75 72 65 20 63 61 6c 63 75 6c  procedure calcul
2a00: 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73  ates and returns
2a10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
2a20: 61 67 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ages used by the
2a30: 20 0a 23 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   .# auto-vacuum 
2a40: 27 70 6f 69 6e 74 65 72 2d 6d 61 70 27 2e 20 49  'pointer-map'. I
2a50: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  f the database d
2a60: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
2a70: 61 75 74 6f 2d 76 61 63 75 75 6d 2c 0a 23 20 74  auto-vacuum,.# t
2a80: 68 65 6e 20 30 20 69 73 20 72 65 74 75 72 6e 65  hen 0 is returne
2a90: 64 2e 20 54 68 65 20 74 77 6f 20 61 72 67 75 6d  d. The two argum
2aa0: 65 6e 74 73 20 61 72 65 20 74 68 65 20 73 69 7a  ents are the siz
2ab0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2ac0: 65 20 66 69 6c 65 20 69 6e 0a 23 20 62 79 74 65  e file in.# byte
2ad0: 73 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 73  s and the page s
2ae0: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
2af0: 64 61 74 61 62 61 73 65 20 28 61 6c 73 6f 20 69  database (also i
2b00: 6e 20 62 79 74 65 73 29 2e 0a 70 72 6f 63 20 61  n bytes)..proc a
2b10: 75 74 6f 76 61 63 75 75 6d 5f 6f 76 65 72 68 65  utovacuum_overhe
2b20: 61 64 20 7b 66 69 6c 65 50 61 67 65 73 20 70 61  ad {filePages pa
2b30: 67 65 53 69 7a 65 7d 20 7b 0a 0a 20 20 23 20 52  geSize} {..  # R
2b40: 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ead the value of
2b50: 20 6d 65 74 61 20 34 2e 20 49 66 20 6e 6f 6e 2d   meta 4. If non-
2b60: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64  zero, then the d
2b70: 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
2b80: 0a 20 20 23 20 61 75 74 6f 2d 76 61 63 75 75 6d  .  # auto-vacuum
2b90: 2e 20 49 74 20 77 6f 75 6c 64 20 62 65 20 70 6f  . It would be po
2ba0: 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 22 50  ssible to use "P
2bb0: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
2bc0: 6d 22 20 69 6e 73 74 65 61 64 2c 0a 20 20 23 20  m" instead,.  # 
2bd0: 62 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  but that would n
2be0: 6f 74 20 77 6f 72 6b 20 69 66 20 74 68 65 20 53  ot work if the S
2bf0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d  QLITE_OMIT_PRAGM
2c00: 41 20 6d 61 63 72 6f 20 77 61 73 20 64 65 66 69  A macro was defi
2c10: 6e 65 64 0a 20 20 23 20 77 68 65 6e 20 74 68 65  ned.  # when the
2c20: 20 6c 69 62 72 61 72 79 20 77 61 73 20 62 75 69   library was bui
2c30: 6c 74 2e 0a 20 20 73 65 74 20 6d 65 74 61 34 20  lt..  set meta4 
2c40: 5b 6c 69 6e 64 65 78 20 5b 62 74 72 65 65 5f 67  [lindex [btree_g
2c50: 65 74 5f 6d 65 74 61 20 24 3a 3a 44 42 5d 20 34  et_meta $::DB] 4
2c60: 5d 0a 0a 20 20 23 20 49 66 20 74 68 65 20 64 61  ]..  # If the da
2c70: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6e  tabase is not an
2c80: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
2c90: 61 62 61 73 65 20 6f 72 20 74 68 65 20 66 69 6c  abase or the fil
2ca0: 65 20 63 6f 6e 73 69 73 74 73 0a 20 20 23 20 6f  e consists.  # o
2cb0: 66 20 6f 6e 65 20 70 61 67 65 20 6f 6e 6c 79 20  f one page only 
2cc0: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
2cd0: 20 6f 76 65 72 68 65 61 64 20 66 6f 72 20 61 75   overhead for au
2ce0: 74 6f 2d 76 61 63 75 75 6d 2e 20 52 65 74 75 72  to-vacuum. Retur
2cf0: 6e 20 7a 65 72 6f 2e 0a 20 20 69 66 20 7b 30 3d  n zero..  if {0=
2d00: 3d 24 6d 65 74 61 34 20 7c 7c 20 24 66 69 6c 65  =$meta4 || $file
2d10: 50 61 67 65 73 3d 3d 31 7d 20 7b 0a 20 20 20 20  Pages==1} {.    
2d20: 72 65 74 75 72 6e 20 30 0a 20 20 7d 0a 0a 20 20  return 0.  }..  
2d30: 23 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  # The number of 
2d40: 65 6e 74 72 69 65 73 20 6f 6e 20 65 61 63 68 20  entries on each 
2d50: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
2d60: 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 6f 66 20  . The layout of 
2d70: 74 68 65 0a 20 20 23 20 64 61 74 61 62 61 73 65  the.  # database
2d80: 20 66 69 6c 65 20 69 73 20 6f 6e 65 20 70 6f 69   file is one poi
2d90: 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 66  nter-map page, f
2da0: 6f 6c 6c 6f 77 65 64 20 62 79 20 24 70 74 72 73  ollowed by $ptrs
2db0: 50 65 72 50 61 67 65 20 6f 74 68 65 72 0a 20 20  PerPage other.  
2dc0: 23 20 70 61 67 65 73 2c 20 66 6f 6c 6c 6f 77 65  # pages, followe
2dd0: 64 20 62 79 20 61 20 70 6f 69 6e 74 65 72 2d 6d  d by a pointer-m
2de0: 61 70 20 70 61 67 65 20 65 74 63 2e 20 54 68 65  ap page etc. The
2df0: 20 66 69 72 73 74 20 70 6f 69 6e 74 65 72 2d 6d   first pointer-m
2e00: 61 70 20 70 61 67 65 0a 20 20 23 20 69 73 20 74  ap page.  # is t
2e10: 68 65 20 73 65 63 6f 6e 64 20 70 61 67 65 20 6f  he second page o
2e20: 66 20 74 68 65 20 66 69 6c 65 20 6f 76 65 72 61  f the file overa
2e30: 6c 6c 2e 0a 20 20 73 65 74 20 70 74 72 73 50 65  ll..  set ptrsPe
2e40: 72 50 61 67 65 20 5b 65 78 70 72 20 64 6f 75 62  rPage [expr doub
2e50: 6c 65 28 24 70 61 67 65 53 69 7a 65 2f 35 29 5d  le($pageSize/5)]
2e60: 0a 0a 20 20 23 20 52 65 74 75 72 6e 20 74 68 65  ..  # Return the
2e70: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   number of point
2e80: 65 72 20 6d 61 70 20 70 61 67 65 73 20 69 6e 20  er map pages in 
2e90: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
2ea0: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 69 6e 74  return [expr int
2eb0: 28 63 65 69 6c 28 20 28 24 66 69 6c 65 50 61 67  (ceil( ($filePag
2ec0: 65 73 2d 31 2e 30 29 2f 28 24 70 74 72 73 50 65  es-1.0)/($ptrsPe
2ed0: 72 50 61 67 65 2b 31 2e 30 29 20 29 29 5d 0a 7d  rPage+1.0) ))].}
2ee0: 0a 0a 23 20 4f 75 74 70 75 74 20 73 75 6d 6d 61  ..# Output summa
2ef0: 72 79 20 73 74 61 74 69 73 74 69 63 73 3a 0a 23  ry statistics:.#
2f00: 0a 70 75 74 73 20 22 2f 2a 2a 20 44 69 73 6b 2d  .puts "/** Disk-
2f10: 53 70 61 63 65 20 55 74 69 6c 69 7a 61 74 69 6f  Space Utilizatio
2f20: 6e 20 52 65 70 6f 72 74 20 46 6f 72 20 24 66 69  n Report For $fi
2f30: 6c 65 5f 74 6f 5f 61 6e 61 6c 79 7a 65 22 0a 70  le_to_analyze".p
2f40: 75 74 73 20 22 2a 2a 2a 20 41 73 20 6f 66 20 5b  uts "*** As of [
2f50: 63 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 63 6c  clock format [cl
2f60: 6f 63 6b 20 73 65 63 6f 6e 64 73 5d 20 2d 66 6f  ock seconds] -fo
2f70: 72 6d 61 74 20 7b 25 59 2d 25 62 2d 25 64 20 25  rmat {%Y-%b-%d %
2f80: 48 3a 25 4d 3a 25 53 7d 5d 22 0a 70 75 74 73 20  H:%M:%S}]".puts 
2f90: 22 22 0a 0a 23 20 56 61 72 69 61 62 6c 65 73 3a  ""..# Variables:
2fa0: 0a 23 0a 23 20 70 61 67 65 53 69 7a 65 3a 20 20  .#.# pageSize:  
2fb0: 20 20 20 20 53 69 7a 65 20 6f 66 20 65 61 63 68      Size of each
2fc0: 20 70 61 67 65 20 69 6e 20 62 79 74 65 73 2e 0a   page in bytes..
2fd0: 23 20 66 69 6c 65 5f 62 79 74 65 73 3a 20 20 20  # file_bytes:   
2fe0: 20 46 69 6c 65 20 73 69 7a 65 20 69 6e 20 62 79   File size in by
2ff0: 74 65 73 2e 0a 23 20 66 69 6c 65 5f 70 67 63 6e  tes..# file_pgcn
3000: 74 3a 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20  t:    Number of 
3010: 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
3020: 65 2e 0a 23 20 66 69 6c 65 5f 70 67 63 6e 74 32  e..# file_pgcnt2
3030: 3a 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 70 61  :   Number of pa
3040: 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
3050: 28 63 61 6c 63 75 6c 61 74 65 64 29 2e 0a 23 20  (calculated)..# 
3060: 61 76 5f 70 67 63 6e 74 3a 20 20 20 20 20 20 50  av_pgcnt:      P
3070: 61 67 65 73 20 63 6f 6e 73 75 6d 65 64 20 62 79  ages consumed by
3080: 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
3090: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 0a 23 20   pointer-map..# 
30a0: 61 76 5f 70 65 72 63 65 6e 74 3a 20 20 20 20 50  av_percent:    P
30b0: 65 72 63 65 6e 74 61 67 65 20 6f 66 20 74 68 65  ercentage of the
30c0: 20 66 69 6c 65 20 63 6f 6e 73 75 6d 65 64 20 62   file consumed b
30d0: 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 6f  y auto-vacuum po
30e0: 69 6e 74 65 72 2d 6d 61 70 2e 0a 23 20 69 6e 75  inter-map..# inu
30f0: 73 65 5f 70 67 63 6e 74 3a 20 20 20 44 61 74 61  se_pgcnt:   Data
3100: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69   pages in the fi
3110: 6c 65 2e 0a 23 20 69 6e 75 73 65 5f 70 65 72 63  le..# inuse_perc
3120: 65 6e 74 3a 20 50 65 72 63 65 6e 74 61 67 65 20  ent: Percentage 
3130: 6f 66 20 70 61 67 65 73 20 75 73 65 64 20 74 6f  of pages used to
3140: 20 73 74 6f 72 65 20 64 61 74 61 2e 0a 23 20 66   store data..# f
3150: 72 65 65 5f 70 67 63 6e 74 3a 20 20 20 20 46 72  ree_pgcnt:    Fr
3160: 65 65 20 70 61 67 65 73 20 63 61 6c 63 75 6c 61  ee pages calcula
3170: 74 65 64 20 61 73 20 28 3c 74 6f 74 61 6c 20 70  ted as (<total p
3180: 61 67 65 73 3e 20 2d 20 3c 69 6e 2d 75 73 65 20  ages> - <in-use 
3190: 70 61 67 65 73 3e 29 0a 23 20 66 72 65 65 5f 70  pages>).# free_p
31a0: 67 63 6e 74 32 3a 20 20 20 46 72 65 65 20 70 61  gcnt2:   Free pa
31b0: 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
31c0: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
31d0: 20 66 69 6c 65 20 68 65 61 64 65 72 2e 0a 23 20   file header..# 
31e0: 66 72 65 65 5f 70 65 72 63 65 6e 74 3a 20 20 50  free_percent:  P
31f0: 65 72 63 65 6e 74 61 67 65 20 6f 66 20 66 69 6c  ercentage of fil
3200: 65 20 63 6f 6e 73 75 6d 65 64 20 62 79 20 66 72  e consumed by fr
3210: 65 65 20 70 61 67 65 73 20 28 63 61 6c 63 75 6c  ee pages (calcul
3220: 61 74 65 64 29 2e 0a 23 20 66 72 65 65 5f 70 65  ated)..# free_pe
3230: 72 63 65 6e 74 32 3a 20 50 65 72 63 65 6e 74 61  rcent2: Percenta
3240: 67 65 20 6f 66 20 66 69 6c 65 20 63 6f 6e 73 75  ge of file consu
3250: 6d 65 64 20 62 79 20 66 72 65 65 20 70 61 67 65  med by free page
3260: 73 20 28 68 65 61 64 65 72 29 2e 0a 23 20 6e 74  s (header)..# nt
3270: 61 62 6c 65 3a 20 20 20 20 20 20 20 20 4e 75 6d  able:        Num
3280: 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  ber of tables in
3290: 20 74 68 65 20 64 62 2e 0a 23 20 6e 69 6e 64 65   the db..# ninde
32a0: 78 3a 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72  x:        Number
32b0: 20 6f 66 20 69 6e 64 69 63 65 73 20 69 6e 20 74   of indices in t
32c0: 68 65 20 64 62 2e 0a 23 20 6e 61 75 74 6f 69 6e  he db..# nautoin
32d0: 64 65 78 3a 20 20 20 20 4e 75 6d 62 65 72 20 6f  dex:    Number o
32e0: 66 20 69 6e 64 69 63 65 73 20 63 72 65 61 74 65  f indices create
32f0: 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  d automatically.
3300: 0a 23 20 6e 6d 61 6e 69 6e 64 65 78 3a 20 20 20  .# nmanindex:   
3310: 20 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 69    Number of indi
3320: 63 65 73 20 63 72 65 61 74 65 64 20 6d 61 6e 75  ces created manu
3330: 61 6c 6c 79 2e 0a 23 20 75 73 65 72 5f 70 61 79  ally..# user_pay
3340: 6c 6f 61 64 3a 0a 0a 73 65 74 20 66 69 6c 65 5f  load:..set file_
3350: 62 79 74 65 73 20 20 5b 66 69 6c 65 20 73 69 7a  bytes  [file siz
3360: 65 20 24 66 69 6c 65 5f 74 6f 5f 61 6e 61 6c 79  e $file_to_analy
3370: 7a 65 5d 0a 73 65 74 20 66 69 6c 65 5f 70 67 63  ze].set file_pgc
3380: 6e 74 20 20 5b 65 78 70 72 20 7b 24 66 69 6c 65  nt  [expr {$file
3390: 5f 62 79 74 65 73 2f 24 70 61 67 65 53 69 7a 65  _bytes/$pageSize
33a0: 7d 5d 0a 0a 73 65 74 20 61 76 5f 70 67 63 6e 74  }]..set av_pgcnt
33b0: 20 20 20 20 5b 61 75 74 6f 76 61 63 75 75 6d 5f      [autovacuum_
33c0: 6f 76 65 72 68 65 61 64 20 24 66 69 6c 65 5f 70  overhead $file_p
33d0: 67 63 6e 74 20 24 70 61 67 65 53 69 7a 65 5d 0a  gcnt $pageSize].
33e0: 73 65 74 20 61 76 5f 70 65 72 63 65 6e 74 20 20  set av_percent  
33f0: 5b 70 65 72 63 65 6e 74 20 24 61 76 5f 70 67 63  [percent $av_pgc
3400: 6e 74 20 24 66 69 6c 65 5f 70 67 63 6e 74 5d 0a  nt $file_pgcnt].
3410: 0a 73 65 74 20 71 20 7b 53 45 4c 45 43 54 20 73  .set q {SELECT s
3420: 75 6d 28 6c 65 61 66 5f 70 61 67 65 73 2b 69 6e  um(leaf_pages+in
3430: 74 5f 70 61 67 65 73 2b 6f 76 66 6c 5f 70 61 67  t_pages+ovfl_pag
3440: 65 73 29 20 46 52 4f 4d 20 73 70 61 63 65 5f 75  es) FROM space_u
3450: 73 65 64 7d 0a 73 65 74 20 69 6e 75 73 65 5f 70  sed}.set inuse_p
3460: 67 63 6e 74 20 20 20 5b 65 78 70 72 20 5b 6d 65  gcnt   [expr [me
3470: 6d 20 65 76 61 6c 20 24 71 5d 5d 0a 73 65 74 20  m eval $q]].set 
3480: 69 6e 75 73 65 5f 70 65 72 63 65 6e 74 20 5b 70  inuse_percent [p
3490: 65 72 63 65 6e 74 20 24 69 6e 75 73 65 5f 70 67  ercent $inuse_pg
34a0: 63 6e 74 20 24 66 69 6c 65 5f 70 67 63 6e 74 5d  cnt $file_pgcnt]
34b0: 0a 0a 73 65 74 20 66 72 65 65 5f 70 67 63 6e 74  ..set free_pgcnt
34c0: 20 20 20 20 5b 65 78 70 72 20 24 66 69 6c 65 5f      [expr $file_
34d0: 70 67 63 6e 74 2d 24 69 6e 75 73 65 5f 70 67 63  pgcnt-$inuse_pgc
34e0: 6e 74 2d 24 61 76 5f 70 67 63 6e 74 5d 0a 73 65  nt-$av_pgcnt].se
34f0: 74 20 66 72 65 65 5f 70 65 72 63 65 6e 74 20 20  t free_percent  
3500: 5b 70 65 72 63 65 6e 74 20 24 66 72 65 65 5f 70  [percent $free_p
3510: 67 63 6e 74 20 24 66 69 6c 65 5f 70 67 63 6e 74  gcnt $file_pgcnt
3520: 5d 0a 73 65 74 20 66 72 65 65 5f 70 67 63 6e 74  ].set free_pgcnt
3530: 32 20 20 20 5b 6c 69 6e 64 65 78 20 5b 62 74 72  2   [lindex [btr
3540: 65 65 5f 67 65 74 5f 6d 65 74 61 20 24 44 42 5d  ee_get_meta $DB]
3550: 20 30 5d 0a 73 65 74 20 66 72 65 65 5f 70 65 72   0].set free_per
3560: 63 65 6e 74 32 20 5b 70 65 72 63 65 6e 74 20 24  cent2 [percent $
3570: 66 72 65 65 5f 70 67 63 6e 74 32 20 24 66 69 6c  free_pgcnt2 $fil
3580: 65 5f 70 67 63 6e 74 5d 0a 0a 73 65 74 20 66 69  e_pgcnt]..set fi
3590: 6c 65 5f 70 67 63 6e 74 32 20 5b 65 78 70 72 20  le_pgcnt2 [expr 
35a0: 7b 24 69 6e 75 73 65 5f 70 67 63 6e 74 2b 24 66  {$inuse_pgcnt+$f
35b0: 72 65 65 5f 70 67 63 6e 74 32 2b 24 61 76 5f 70  ree_pgcnt2+$av_p
35c0: 67 63 6e 74 7d 5d 0a 0a 73 65 74 20 6e 74 61 62  gcnt}]..set ntab
35d0: 6c 65 20 5b 64 62 20 65 76 61 6c 20 7b 53 45 4c  le [db eval {SEL
35e0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 2b 31 20 46  ECT count(*)+1 F
35f0: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
3600: 72 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61  r WHERE type='ta
3610: 62 6c 65 27 7d 5d 0a 73 65 74 20 6e 69 6e 64 65  ble'}].set ninde
3620: 78 20 5b 64 62 20 65 76 61 6c 20 7b 53 45 4c 45  x [db eval {SELE
3630: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
3640: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
3650: 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78  HERE type='index
3660: 27 7d 5d 0a 73 65 74 20 71 20 7b 53 45 4c 45 43  '}].set q {SELEC
3670: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
3680: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48  sqlite_master WH
3690: 45 52 45 20 6e 61 6d 65 20 4c 49 4b 45 20 27 73  ERE name LIKE 's
36a0: 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 25  qlite_autoindex%
36b0: 27 7d 0a 73 65 74 20 6e 61 75 74 6f 69 6e 64 65  '}.set nautoinde
36c0: 78 20 5b 64 62 20 65 76 61 6c 20 24 71 5d 0a 73  x [db eval $q].s
36d0: 65 74 20 6e 6d 61 6e 69 6e 64 65 78 20 5b 65 78  et nmanindex [ex
36e0: 70 72 20 7b 24 6e 69 6e 64 65 78 2d 24 6e 61 75  pr {$nindex-$nau
36f0: 74 6f 69 6e 64 65 78 7d 5d 0a 0a 23 20 73 65 74  toindex}]..# set
3700: 20 74 6f 74 61 6c 5f 70 61 79 6c 6f 61 64 20 5b   total_payload [
3710: 6d 65 6d 20 65 76 61 6c 20 22 53 45 4c 45 43 54  mem eval "SELECT
3720: 20 73 75 6d 28 70 61 79 6c 6f 61 64 29 20 46 52   sum(payload) FR
3730: 4f 4d 20 73 70 61 63 65 5f 75 73 65 64 22 5d 0a  OM space_used"].
3740: 73 65 74 20 75 73 65 72 5f 70 61 79 6c 6f 61 64  set user_payload
3750: 20 5b 6d 65 6d 20 6f 6e 65 20 7b 53 45 4c 45 43   [mem one {SELEC
3760: 54 20 73 75 6d 28 70 61 79 6c 6f 61 64 29 20 46  T sum(payload) F
3770: 52 4f 4d 20 73 70 61 63 65 5f 75 73 65 64 0a 20  ROM space_used. 
3780: 20 20 20 20 57 48 45 52 45 20 4e 4f 54 20 69 73      WHERE NOT is
3790: 5f 69 6e 64 65 78 20 41 4e 44 20 6e 61 6d 65 20  _index AND name 
37a0: 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65  NOT LIKE 'sqlite
37b0: 5f 6d 61 73 74 65 72 27 7d 5d 0a 73 65 74 20 75  _master'}].set u
37c0: 73 65 72 5f 70 61 79 6c 6f 61 64 5f 70 65 72 63  ser_payload_perc
37d0: 65 6e 74 20 5b 70 65 72 63 65 6e 74 20 24 75 73  ent [percent $us
37e0: 65 72 5f 70 61 79 6c 6f 61 64 20 24 66 69 6c 65  er_payload $file
37f0: 5f 62 79 74 65 73 5d 0a 0a 73 74 61 74 6c 69 6e  _bytes]..statlin
3800: 65 20 7b 50 61 67 65 20 73 69 7a 65 20 69 6e 20  e {Page size in 
3810: 62 79 74 65 73 7d 20 24 70 61 67 65 53 69 7a 65  bytes} $pageSize
3820: 0a 73 74 61 74 6c 69 6e 65 20 7b 50 61 67 65 73  .statline {Pages
3830: 20 69 6e 20 74 68 65 20 77 68 6f 6c 65 20 66 69   in the whole fi
3840: 6c 65 20 28 6d 65 61 73 75 72 65 64 29 7d 20 24  le (measured)} $
3850: 66 69 6c 65 5f 70 67 63 6e 74 0a 73 74 61 74 6c  file_pgcnt.statl
3860: 69 6e 65 20 7b 50 61 67 65 73 20 69 6e 20 74 68  ine {Pages in th
3870: 65 20 77 68 6f 6c 65 20 66 69 6c 65 20 28 63 61  e whole file (ca
3880: 6c 63 75 6c 61 74 65 64 29 7d 20 24 66 69 6c 65  lculated)} $file
3890: 5f 70 67 63 6e 74 32 0a 73 74 61 74 6c 69 6e 65  _pgcnt2.statline
38a0: 20 7b 50 61 67 65 73 20 74 68 61 74 20 73 74 6f   {Pages that sto
38b0: 72 65 20 64 61 74 61 7d 20 24 69 6e 75 73 65 5f  re data} $inuse_
38c0: 70 67 63 6e 74 20 24 69 6e 75 73 65 5f 70 65 72  pgcnt $inuse_per
38d0: 63 65 6e 74 0a 73 74 61 74 6c 69 6e 65 20 7b 50  cent.statline {P
38e0: 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
38f0: 6c 69 73 74 20 28 70 65 72 20 68 65 61 64 65 72  list (per header
3900: 29 7d 20 24 66 72 65 65 5f 70 67 63 6e 74 32 20  )} $free_pgcnt2 
3910: 24 66 72 65 65 5f 70 65 72 63 65 6e 74 32 0a 73  $free_percent2.s
3920: 74 61 74 6c 69 6e 65 20 7b 50 61 67 65 73 20 6f  tatline {Pages o
3930: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28  n the freelist (
3940: 63 61 6c 63 75 6c 61 74 65 64 29 7d 20 24 66 72  calculated)} $fr
3950: 65 65 5f 70 67 63 6e 74 20 24 66 72 65 65 5f 70  ee_pgcnt $free_p
3960: 65 72 63 65 6e 74 0a 73 74 61 74 6c 69 6e 65 20  ercent.statline 
3970: 7b 50 61 67 65 73 20 6f 66 20 61 75 74 6f 2d 76  {Pages of auto-v
3980: 61 63 75 75 6d 20 6f 76 65 72 68 65 61 64 7d 20  acuum overhead} 
3990: 24 61 76 5f 70 67 63 6e 74 20 24 61 76 5f 70 65  $av_pgcnt $av_pe
39a0: 72 63 65 6e 74 0a 73 74 61 74 6c 69 6e 65 20 7b  rcent.statline {
39b0: 4e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  Number of tables
39c0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
39d0: 7d 20 24 6e 74 61 62 6c 65 0a 73 74 61 74 6c 69  } $ntable.statli
39e0: 6e 65 20 7b 4e 75 6d 62 65 72 20 6f 66 20 69 6e  ne {Number of in
39f0: 64 69 63 65 73 7d 20 24 6e 69 6e 64 65 78 0a 73  dices} $nindex.s
3a00: 74 61 74 6c 69 6e 65 20 7b 4e 75 6d 62 65 72 20  tatline {Number 
3a10: 6f 66 20 6e 61 6d 65 64 20 69 6e 64 69 63 65 73  of named indices
3a20: 7d 20 24 6e 6d 61 6e 69 6e 64 65 78 0a 73 74 61  } $nmanindex.sta
3a30: 74 6c 69 6e 65 20 7b 41 75 74 6f 6d 61 74 69 63  tline {Automatic
3a40: 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 20 69  ally generated i
3a50: 6e 64 69 63 65 73 7d 20 24 6e 61 75 74 6f 69 6e  ndices} $nautoin
3a60: 64 65 78 0a 73 74 61 74 6c 69 6e 65 20 7b 53 69  dex.statline {Si
3a70: 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ze of the file i
3a80: 6e 20 62 79 74 65 73 7d 20 24 66 69 6c 65 5f 62  n bytes} $file_b
3a90: 79 74 65 73 0a 73 74 61 74 6c 69 6e 65 20 7b 42  ytes.statline {B
3aa0: 79 74 65 73 20 6f 66 20 75 73 65 72 20 70 61 79  ytes of user pay
3ab0: 6c 6f 61 64 20 73 74 6f 72 65 64 7d 20 24 75 73  load stored} $us
3ac0: 65 72 5f 70 61 79 6c 6f 61 64 20 24 75 73 65 72  er_payload $user
3ad0: 5f 70 61 79 6c 6f 61 64 5f 70 65 72 63 65 6e 74  _payload_percent
3ae0: 0a 0a 23 20 4f 75 74 70 75 74 20 74 61 62 6c 65  ..# Output table
3af0: 20 72 61 6e 6b 69 6e 67 73 0a 23 0a 70 75 74 73   rankings.#.puts
3b00: 20 22 22 0a 70 75 74 73 20 22 2a 2a 2a 20 50 61   "".puts "*** Pa
3b10: 67 65 20 63 6f 75 6e 74 73 20 66 6f 72 20 61 6c  ge counts for al
3b20: 6c 20 74 61 62 6c 65 73 20 77 69 74 68 20 74 68  l tables with th
3b30: 65 69 72 20 69 6e 64 69 63 65 73 20 2a 2a 2a 2a  eir indices ****
3b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b50: 22 0a 70 75 74 73 20 22 22 0a 6d 65 6d 20 65 76  ".puts "".mem ev
3b60: 61 6c 20 7b 53 45 4c 45 43 54 20 74 62 6c 6e 61  al {SELECT tblna
3b70: 6d 65 2c 20 63 6f 75 6e 74 28 2a 29 20 41 53 20  me, count(*) AS 
3b80: 63 6e 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  cnt, .          
3b90: 20 20 20 20 73 75 6d 28 69 6e 74 5f 70 61 67 65      sum(int_page
3ba0: 73 2b 6c 65 61 66 5f 70 61 67 65 73 2b 6f 76 66  s+leaf_pages+ovf
3bb0: 6c 5f 70 61 67 65 73 29 20 41 53 20 73 69 7a 65  l_pages) AS size
3bc0: 0a 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20  .          FROM 
3bd0: 73 70 61 63 65 5f 75 73 65 64 20 47 52 4f 55 50  space_used GROUP
3be0: 20 42 59 20 74 62 6c 6e 61 6d 65 20 4f 52 44 45   BY tblname ORDE
3bf0: 52 20 42 59 20 73 69 7a 65 20 44 45 53 43 2c 20  R BY size DESC, 
3c00: 74 62 6c 6e 61 6d 65 7d 20 7b 7d 20 7b 0a 20 20  tblname} {} {.  
3c10: 73 74 61 74 6c 69 6e 65 20 5b 73 74 72 69 6e 67  statline [string
3c20: 20 74 6f 75 70 70 65 72 20 24 74 62 6c 6e 61 6d   toupper $tblnam
3c30: 65 5d 20 24 73 69 7a 65 20 5b 70 65 72 63 65 6e  e] $size [percen
3c40: 74 20 24 73 69 7a 65 20 24 66 69 6c 65 5f 70 67  t $size $file_pg
3c50: 63 6e 74 5d 0a 7d 0a 0a 23 20 4f 75 74 70 75 74  cnt].}..# Output
3c60: 20 73 75 62 72 65 70 6f 72 74 73 0a 23 0a 69 66   subreports.#.if
3c70: 20 7b 24 6e 69 6e 64 65 78 3e 30 7d 20 7b 0a 20   {$nindex>0} {. 
3c80: 20 73 75 62 72 65 70 6f 72 74 20 7b 41 6c 6c 20   subreport {All 
3c90: 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63  tables and indic
3ca0: 65 73 7d 20 31 0a 7d 0a 73 75 62 72 65 70 6f 72  es} 1.}.subrepor
3cb0: 74 20 7b 41 6c 6c 20 74 61 62 6c 65 73 7d 20 7b  t {All tables} {
3cc0: 4e 4f 54 20 69 73 5f 69 6e 64 65 78 7d 0a 69 66  NOT is_index}.if
3cd0: 20 7b 24 6e 69 6e 64 65 78 3e 30 7d 20 7b 0a 20   {$nindex>0} {. 
3ce0: 20 73 75 62 72 65 70 6f 72 74 20 7b 41 6c 6c 20   subreport {All 
3cf0: 69 6e 64 69 63 65 73 7d 20 7b 69 73 5f 69 6e 64  indices} {is_ind
3d00: 65 78 7d 0a 7d 0a 66 6f 72 65 61 63 68 20 74 62  ex}.}.foreach tb
3d10: 6c 20 5b 6d 65 6d 20 65 76 61 6c 20 7b 53 45 4c  l [mem eval {SEL
3d20: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 70  ECT name FROM sp
3d30: 61 63 65 5f 75 73 65 64 20 57 48 45 52 45 20 4e  ace_used WHERE N
3d40: 4f 54 20 69 73 5f 69 6e 64 65 78 0a 20 20 20 20  OT is_index.    
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d60: 20 20 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65     ORDER BY name
3d70: 7d 5d 20 7b 0a 20 20 72 65 67 73 75 62 20 27 20  }] {.  regsub ' 
3d80: 24 74 62 6c 20 27 27 20 71 6e 0a 20 20 73 65 74  $tbl '' qn.  set
3d90: 20 6e 61 6d 65 20 5b 73 74 72 69 6e 67 20 74 6f   name [string to
3da0: 75 70 70 65 72 20 24 74 62 6c 5d 0a 20 20 73 65  upper $tbl].  se
3db0: 74 20 6e 20 5b 6d 65 6d 20 65 76 61 6c 20 22 53  t n [mem eval "S
3dc0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
3dd0: 52 4f 4d 20 73 70 61 63 65 5f 75 73 65 64 20 57  ROM space_used W
3de0: 48 45 52 45 20 74 62 6c 6e 61 6d 65 3d 27 24 71  HERE tblname='$q
3df0: 6e 27 22 5d 0a 20 20 69 66 20 7b 24 6e 3e 31 7d  n'"].  if {$n>1}
3e00: 20 7b 0a 20 20 20 20 73 75 62 72 65 70 6f 72 74   {.    subreport
3e10: 20 22 54 61 62 6c 65 20 24 6e 61 6d 65 20 61 6e   "Table $name an
3e20: 64 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  d all its indice
3e30: 73 22 20 22 74 62 6c 6e 61 6d 65 3d 27 24 71 6e  s" "tblname='$qn
3e40: 27 22 0a 20 20 20 20 73 75 62 72 65 70 6f 72 74  '".    subreport
3e50: 20 22 54 61 62 6c 65 20 24 6e 61 6d 65 20 77 2f   "Table $name w/
3e60: 6f 20 61 6e 79 20 69 6e 64 69 63 65 73 22 20 22  o any indices" "
3e70: 6e 61 6d 65 3d 27 24 71 6e 27 22 0a 20 20 20 20  name='$qn'".    
3e80: 73 75 62 72 65 70 6f 72 74 20 22 49 6e 64 69 63  subreport "Indic
3e90: 65 73 20 6f 66 20 74 61 62 6c 65 20 24 6e 61 6d  es of table $nam
3ea0: 65 22 20 22 74 62 6c 6e 61 6d 65 3d 27 24 71 6e  e" "tblname='$qn
3eb0: 27 20 41 4e 44 20 69 73 5f 69 6e 64 65 78 22 0a  ' AND is_index".
3ec0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 73    } else {.    s
3ed0: 75 62 72 65 70 6f 72 74 20 22 54 61 62 6c 65 20  ubreport "Table 
3ee0: 24 6e 61 6d 65 22 20 22 6e 61 6d 65 3d 27 24 71  $name" "name='$q
3ef0: 6e 27 22 0a 20 20 7d 0a 7d 0a 0a 23 20 4f 75 74  n'".  }.}..# Out
3f00: 70 75 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  put instructions
3f10: 20 6f 6e 20 77 68 61 74 20 74 68 65 20 6e 75 6d   on what the num
3f20: 62 65 72 73 20 61 62 6f 76 65 20 6d 65 61 6e 2e  bers above mean.
3f30: 0a 23 0a 70 75 74 73 20 7b 0a 2a 2a 2a 20 44 65  .#.puts {.*** De
3f40: 66 69 6e 69 74 69 6f 6e 73 20 2a 2a 2a 2a 2a 2a  finitions ******
3f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3f80: 0a 0a 50 61 67 65 20 73 69 7a 65 20 69 6e 20 62  ..Page size in b
3f90: 79 74 65 73 0a 0a 20 20 20 20 54 68 65 20 6e 75  ytes..    The nu
3fa0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
3fb0: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f   a single page o
3fc0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
3fd0: 69 6c 65 2e 20 20 0a 20 20 20 20 55 73 75 61 6c  ile.  .    Usual
3fe0: 6c 79 20 31 30 32 34 2e 0a 0a 4e 75 6d 62 65 72  ly 1024...Number
3ff0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
4000: 20 77 68 6f 6c 65 20 66 69 6c 65 0a 7d 0a 70 75   whole file.}.pu
4010: 74 73 20 5c 0a 22 20 20 20 20 54 68 65 20 6e 75  ts \."    The nu
4020: 6d 62 65 72 20 6f 66 20 24 70 61 67 65 53 69 7a  mber of $pageSiz
4030: 65 2d 62 79 74 65 20 70 61 67 65 73 20 74 68 61  e-byte pages tha
4040: 74 20 67 6f 20 69 6e 74 6f 20 66 6f 72 6d 69 6e  t go into formin
4050: 67 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 0a 20  g the complete. 
4060: 20 20 20 64 61 74 61 62 61 73 65 22 0a 70 75 74     database".put
4070: 73 20 5c 0a 7b 0a 50 61 67 65 73 20 74 68 61 74  s \.{.Pages that
4080: 20 73 74 6f 72 65 20 64 61 74 61 0a 0a 20 20 20   store data..   
4090: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   The number of p
40a0: 61 67 65 73 20 74 68 61 74 20 73 74 6f 72 65 20  ages that store 
40b0: 64 61 74 61 2c 20 65 69 74 68 65 72 20 61 73 20  data, either as 
40c0: 70 72 69 6d 61 72 79 20 42 2a 54 72 65 65 20 70  primary B*Tree p
40d0: 61 67 65 73 20 6f 72 0a 20 20 20 20 61 73 20 6f  ages or.    as o
40e0: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20  verflow pages.  
40f0: 54 68 65 20 6e 75 6d 62 65 72 20 61 74 20 74 68  The number at th
4100: 65 20 72 69 67 68 74 20 69 73 20 74 68 65 20 64  e right is the d
4110: 61 74 61 20 70 61 67 65 73 20 64 69 76 69 64 65  ata pages divide
4120: 64 20 62 79 0a 20 20 20 20 74 68 65 20 74 6f 74  d by.    the tot
4130: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
4140: 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a  es in the file..
4150: 0a 50 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72  .Pages on the fr
4160: 65 65 6c 69 73 74 0a 0a 20 20 20 20 54 68 65 20  eelist..    The 
4170: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
4180: 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63 75 72  that are not cur
4190: 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 62 75  rently in use bu
41a0: 74 20 61 72 65 20 72 65 73 65 72 76 65 64 20 66  t are reserved f
41b0: 6f 72 0a 20 20 20 20 66 75 74 75 72 65 20 75 73  or.    future us
41c0: 65 2e 20 20 54 68 65 20 70 65 72 63 65 6e 74 61  e.  The percenta
41d0: 67 65 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ge at the right 
41e0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
41f0: 20 66 72 65 65 6c 69 73 74 20 70 61 67 65 73 0a   freelist pages.
4200: 20 20 20 20 64 69 76 69 64 65 64 20 62 79 20 74      divided by t
4210: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
4220: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
4230: 66 69 6c 65 2e 0a 0a 50 61 67 65 73 20 6f 66 20  file...Pages of 
4240: 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 76 65 72  auto-vacuum over
4250: 68 65 61 64 0a 0a 20 20 20 20 54 68 65 20 6e 75  head..    The nu
4260: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
4270: 61 74 20 73 74 6f 72 65 20 64 61 74 61 20 75 73  at store data us
4280: 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61  ed by the databa
4290: 73 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  se to facilitate
42a0: 0a 20 20 20 20 61 75 74 6f 2d 76 61 63 75 75 6d  .    auto-vacuum
42b0: 2e 20 54 68 69 73 20 69 73 20 7a 65 72 6f 20 66  . This is zero f
42c0: 6f 72 20 64 61 74 61 62 61 73 65 73 20 74 68 61  or databases tha
42d0: 74 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  t do not support
42e0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 2e 0a 0a 4e   auto-vacuum...N
42f0: 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
4300: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  in the database.
4310: 0a 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20  .    The number 
4320: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
4330: 20 64 61 74 61 62 61 73 65 2c 20 69 6e 63 6c 75   database, inclu
4340: 64 69 6e 67 20 74 68 65 20 53 51 4c 49 54 45 5f  ding the SQLITE_
4350: 4d 41 53 54 45 52 20 74 61 62 6c 65 0a 20 20 20  MASTER table.   
4360: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 73   used to store s
4370: 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f  chema informatio
4380: 6e 2e 0a 0a 4e 75 6d 62 65 72 20 6f 66 20 69 6e  n...Number of in
4390: 64 69 63 65 73 0a 0a 20 20 20 20 54 68 65 20 74  dices..    The t
43a0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69  otal number of i
43b0: 6e 64 69 63 65 73 20 69 6e 20 74 68 65 20 64 61  ndices in the da
43c0: 74 61 62 61 73 65 2e 0a 0a 4e 75 6d 62 65 72 20  tabase...Number 
43d0: 6f 66 20 6e 61 6d 65 64 20 69 6e 64 69 63 65 73  of named indices
43e0: 0a 0a 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72  ..    The number
43f0: 20 6f 66 20 69 6e 64 69 63 65 73 20 63 72 65 61   of indices crea
4400: 74 65 64 20 75 73 69 6e 67 20 61 6e 20 65 78 70  ted using an exp
4410: 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44  licit CREATE IND
4420: 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 0a 41  EX statement...A
4430: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e  utomatically gen
4440: 65 72 61 74 65 64 20 69 6e 64 69 63 65 73 0a 0a  erated indices..
4450: 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f      The number o
4460: 66 20 69 6e 64 69 63 65 73 20 75 73 65 64 20 74  f indices used t
4470: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 50 52 49 4d  o implement PRIM
4480: 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
4490: 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  E constraints.  
44a0: 20 20 6f 6e 20 74 61 62 6c 65 73 2e 0a 0a 53 69    on tables...Si
44b0: 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ze of the file i
44c0: 6e 20 62 79 74 65 73 0a 0a 20 20 20 20 54 68 65  n bytes..    The
44d0: 20 74 6f 74 61 6c 20 61 6d 6f 75 6e 74 20 6f 66   total amount of
44e0: 20 64 69 73 6b 20 73 70 61 63 65 20 75 73 65 64   disk space used
44f0: 20 62 79 20 74 68 65 20 65 6e 74 69 72 65 20 64   by the entire d
4500: 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 0a  atabase files...
4510: 42 79 74 65 73 20 6f 66 20 75 73 65 72 20 70 61  Bytes of user pa
4520: 79 6c 6f 61 64 20 73 74 6f 72 65 64 0a 0a 20 20  yload stored..  
4530: 20 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62    The total numb
4540: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 75  er of bytes of u
4550: 73 65 72 20 70 61 79 6c 6f 61 64 20 73 74 6f 72  ser payload stor
4560: 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ed in the databa
4570: 73 65 2e 20 54 68 65 0a 20 20 20 20 73 63 68 65  se. The.    sche
4580: 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ma information i
4590: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  n the SQLITE_MAS
45a0: 54 45 52 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  TER table is not
45b0: 20 63 6f 75 6e 74 65 64 20 77 68 65 6e 0a 20 20   counted when.  
45c0: 20 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 69 73    computing this
45d0: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 70 65   number.  The pe
45e0: 72 63 65 6e 74 61 67 65 20 61 74 20 74 68 65 20  rcentage at the 
45f0: 72 69 67 68 74 20 73 68 6f 77 73 20 74 68 65 20  right shows the 
4600: 70 61 79 6c 6f 61 64 0a 20 20 20 20 64 69 76 69  payload.    divi
4610: 64 65 64 20 62 79 20 74 68 65 20 74 6f 74 61 6c  ded by the total
4620: 20 66 69 6c 65 20 73 69 7a 65 2e 0a 0a 50 65 72   file size...Per
4630: 63 65 6e 74 61 67 65 20 6f 66 20 74 6f 74 61 6c  centage of total
4640: 20 64 61 74 61 62 61 73 65 0a 0a 20 20 20 20 54   database..    T
4650: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65  he amount of the
4660: 20 63 6f 6d 70 6c 65 74 65 20 64 61 74 61 62 61   complete databa
4670: 73 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20  se file that is 
4680: 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f 72 69  devoted to stori
4690: 6e 67 0a 20 20 20 20 69 6e 66 6f 72 6d 61 74 69  ng.    informati
46a0: 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20  on described by 
46b0: 74 68 69 73 20 63 61 74 65 67 6f 72 79 2e 0a 0a  this category...
46c0: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
46d0: 73 0a 0a 20 20 20 20 54 68 65 20 74 6f 74 61 6c  s..    The total
46e0: 20 6e 75 6d 62 65 72 20 6f 66 20 42 2d 54 72 65   number of B-Tre
46f0: 65 20 6b 65 79 2f 76 61 6c 75 65 20 70 61 69 72  e key/value pair
4700: 73 20 73 74 6f 72 65 64 20 75 6e 64 65 72 20 74  s stored under t
4710: 68 69 73 20 63 61 74 65 67 6f 72 79 2e 0a 0a 42  his category...B
4720: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
4730: 63 6f 6e 73 75 6d 65 64 0a 0a 20 20 20 20 54 68  consumed..    Th
4740: 65 20 74 6f 74 61 6c 20 61 6d 6f 75 6e 74 20 6f  e total amount o
4750: 66 20 64 69 73 6b 20 73 70 61 63 65 20 72 65 71  f disk space req
4760: 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 61  uired to store a
4770: 6c 6c 20 42 2d 54 72 65 65 20 65 6e 74 72 69 65  ll B-Tree entrie
4780: 73 0a 20 20 20 20 75 6e 64 65 72 20 74 68 69 73  s.    under this
4790: 20 63 61 74 65 67 6f 72 79 2e 20 20 54 68 65 20   category.  The 
47a0: 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
47b0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 75 73 65  ber of pages use
47c0: 64 20 74 69 6d 65 73 0a 20 20 20 20 74 68 65 20  d times.    the 
47d0: 70 61 67 65 73 20 73 69 7a 65 2e 0a 0a 42 79 74  pages size...Byt
47e0: 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 0a 0a 20  es of payload.. 
47f0: 20 20 20 54 68 65 20 61 6d 6f 75 6e 74 20 6f 66     The amount of
4800: 20 70 61 79 6c 6f 61 64 20 73 74 6f 72 65 64 20   payload stored 
4810: 75 6e 64 65 72 20 74 68 69 73 20 63 61 74 65 67  under this categ
4820: 6f 72 79 2e 20 20 50 61 79 6c 6f 61 64 20 69 73  ory.  Payload is
4830: 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 70 61   the data.    pa
4840: 72 74 20 6f 66 20 74 61 62 6c 65 20 65 6e 74 72  rt of table entr
4850: 69 65 73 20 61 6e 64 20 74 68 65 20 6b 65 79 20  ies and the key 
4860: 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 65 6e  part of index en
4870: 74 72 69 65 73 2e 20 20 54 68 65 20 70 65 72 63  tries.  The perc
4880: 65 6e 74 61 67 65 0a 20 20 20 20 61 74 20 74 68  entage.    at th
4890: 65 20 72 69 67 68 74 20 69 73 20 74 68 65 20 62  e right is the b
48a0: 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20  ytes of payload 
48b0: 64 69 76 69 64 65 64 20 62 79 20 74 68 65 20 62  divided by the b
48c0: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
48d0: 0a 20 20 20 20 63 6f 6e 73 75 6d 65 64 2e 0a 0a  .    consumed...
48e0: 41 76 65 72 61 67 65 20 70 61 79 6c 6f 61 64 20  Average payload 
48f0: 70 65 72 20 65 6e 74 72 79 0a 0a 20 20 20 20 54  per entry..    T
4900: 68 65 20 61 76 65 72 61 67 65 20 61 6d 6f 75 6e  he average amoun
4910: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 6f 6e 20  t of payload on 
4920: 65 61 63 68 20 65 6e 74 72 79 2e 20 20 54 68 69  each entry.  Thi
4930: 73 20 69 73 20 6a 75 73 74 20 74 68 65 20 62 79  s is just the by
4940: 74 65 73 20 6f 66 0a 20 20 20 20 70 61 79 6c 6f  tes of.    paylo
4950: 61 64 20 64 69 76 69 64 65 64 20 62 79 20 74 68  ad divided by th
4960: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
4970: 69 65 73 2e 0a 0a 41 76 65 72 61 67 65 20 75 6e  ies...Average un
4980: 75 73 65 64 20 62 79 74 65 73 20 70 65 72 20 65  used bytes per e
4990: 6e 74 72 79 0a 0a 20 20 20 20 54 68 65 20 61 76  ntry..    The av
49a0: 65 72 61 67 65 20 61 6d 6f 75 6e 74 20 6f 66 20  erage amount of 
49b0: 66 72 65 65 20 73 70 61 63 65 20 72 65 6d 61 69  free space remai
49c0: 6e 69 6e 67 20 6f 6e 20 61 6c 6c 20 70 61 67 65  ning on all page
49d0: 73 20 75 6e 64 65 72 20 74 68 69 73 0a 20 20 20  s under this.   
49e0: 20 63 61 74 65 67 6f 72 79 20 6f 6e 20 61 20 70   category on a p
49f0: 65 72 2d 65 6e 74 72 79 20 62 61 73 69 73 2e 20  er-entry basis. 
4a00: 20 54 68 69 73 20 69 73 20 74 68 65 20 6e 75 6d   This is the num
4a10: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
4a20: 74 65 73 20 6f 6e 0a 20 20 20 20 61 6c 6c 20 70  tes on.    all p
4a30: 61 67 65 73 20 64 69 76 69 64 65 64 20 62 79 20  ages divided by 
4a40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
4a50: 74 72 69 65 73 2e 0a 0a 4d 61 78 69 6d 75 6d 20  tries...Maximum 
4a60: 70 61 79 6c 6f 61 64 20 70 65 72 20 65 6e 74 72  payload per entr
4a70: 79 0a 0a 20 20 20 20 54 68 65 20 6c 61 72 67 65  y..    The large
4a80: 73 74 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20  st payload size 
4a90: 6f 66 20 61 6e 79 20 65 6e 74 72 79 2e 0a 0a 45  of any entry...E
4aa0: 6e 74 72 69 65 73 20 74 68 61 74 20 75 73 65 20  ntries that use 
4ab0: 6f 76 65 72 66 6c 6f 77 0a 0a 20 20 20 20 54 68  overflow..    Th
4ac0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
4ad0: 69 65 73 20 74 68 61 74 20 75 73 65 72 20 6f 6e  ies that user on
4ae0: 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
4af0: 6f 77 20 70 61 67 65 73 2e 0a 0a 54 6f 74 61 6c  ow pages...Total
4b00: 20 70 61 67 65 73 20 75 73 65 64 0a 0a 20 20 20   pages used..   
4b10: 20 54 68 69 73 20 69 73 20 74 68 65 20 6e 75 6d   This is the num
4b20: 62 65 72 20 6f 66 20 70 61 67 65 73 20 75 73 65  ber of pages use
4b30: 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 69 6e  d to hold all in
4b40: 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
4b50: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 63 61 74   current.    cat
4b60: 65 67 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20  egory.  This is 
4b70: 74 68 65 20 73 75 6d 20 6f 66 20 69 6e 64 65 78  the sum of index
4b80: 2c 20 70 72 69 6d 61 72 79 2c 20 61 6e 64 20 6f  , primary, and o
4b90: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 0a  verflow pages...
4ba0: 49 6e 64 65 78 20 70 61 67 65 73 20 75 73 65 64  Index pages used
4bb0: 0a 0a 20 20 20 20 54 68 69 73 20 69 73 20 74 68  ..    This is th
4bc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
4bd0: 73 20 69 6e 20 61 20 74 61 62 6c 65 20 42 2d 74  s in a table B-t
4be0: 72 65 65 20 74 68 61 74 20 68 6f 6c 64 20 6f 6e  ree that hold on
4bf0: 6c 79 20 6b 65 79 20 28 72 6f 77 69 64 29 0a 20  ly key (rowid). 
4c00: 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61     information a
4c10: 6e 64 20 6e 6f 20 64 61 74 61 2e 0a 0a 50 72 69  nd no data...Pri
4c20: 6d 61 72 79 20 70 61 67 65 73 20 75 73 65 64 0a  mary pages used.
4c30: 0a 20 20 20 20 54 68 69 73 20 69 73 20 74 68 65  .    This is the
4c40: 20 6e 75 6d 62 65 72 20 6f 66 20 42 2d 74 72 65   number of B-tre
4c50: 65 20 70 61 67 65 73 20 74 68 61 74 20 68 6f 6c  e pages that hol
4c60: 64 20 62 6f 74 68 20 6b 65 79 20 61 6e 64 20 64  d both key and d
4c70: 61 74 61 2e 0a 0a 4f 76 65 72 66 6c 6f 77 20 70  ata...Overflow p
4c80: 61 67 65 73 20 75 73 65 64 0a 0a 20 20 20 20 54  ages used..    T
4c90: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
4ca0: 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  of overflow page
4cb0: 73 20 75 73 65 64 20 66 6f 72 20 74 68 69 73 20  s used for this 
4cc0: 63 61 74 65 67 6f 72 79 2e 0a 0a 55 6e 75 73 65  category...Unuse
4cd0: 64 20 62 79 74 65 73 20 6f 6e 20 69 6e 64 65 78  d bytes on index
4ce0: 20 70 61 67 65 73 0a 0a 20 20 20 20 54 68 65 20   pages..    The 
4cf0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
4d00: 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  bytes of unused 
4d10: 73 70 61 63 65 20 6f 6e 20 61 6c 6c 20 69 6e 64  space on all ind
4d20: 65 78 20 70 61 67 65 73 2e 20 20 54 68 65 0a 20  ex pages.  The. 
4d30: 20 20 20 70 65 72 63 65 6e 74 61 67 65 20 61 74     percentage at
4d40: 20 74 68 65 20 72 69 67 68 74 20 69 73 20 74 68   the right is th
4d50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73  e number of unus
4d60: 65 64 20 62 79 74 65 73 20 64 69 76 69 64 65 64  ed bytes divided
4d70: 20 62 79 20 74 68 65 0a 20 20 20 20 74 6f 74 61   by the.    tota
4d80: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
4d90: 73 20 6f 6e 20 69 6e 64 65 78 20 70 61 67 65 73  s on index pages
4da0: 2e 0a 0a 55 6e 75 73 65 64 20 62 79 74 65 73 20  ...Unused bytes 
4db0: 6f 6e 20 70 72 69 6d 61 72 79 20 70 61 67 65 73  on primary pages
4dc0: 0a 0a 20 20 20 20 54 68 65 20 74 6f 74 61 6c 20  ..    The total 
4dd0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
4de0: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  of unused space 
4df0: 6f 6e 20 61 6c 6c 20 70 72 69 6d 61 72 79 20 70  on all primary p
4e00: 61 67 65 73 2e 20 20 54 68 65 0a 20 20 20 20 70  ages.  The.    p
4e10: 65 72 63 65 6e 74 61 67 65 20 61 74 20 74 68 65  ercentage at the
4e20: 20 72 69 67 68 74 20 69 73 20 74 68 65 20 6e 75   right is the nu
4e30: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
4e40: 79 74 65 73 20 64 69 76 69 64 65 64 20 62 79 20  ytes divided by 
4e50: 74 68 65 0a 20 20 20 20 74 6f 74 61 6c 20 6e 75  the.    total nu
4e60: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 6e  mber of bytes on
4e70: 20 70 72 69 6d 61 72 79 20 70 61 67 65 73 2e 0a   primary pages..
4e80: 0a 55 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e  .Unused bytes on
4e90: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a   overflow pages.
4ea0: 0a 20 20 20 20 54 68 65 20 74 6f 74 61 6c 20 6e  .    The total n
4eb0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
4ec0: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
4ed0: 6e 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70  n all overflow p
4ee0: 61 67 65 73 2e 20 20 54 68 65 0a 20 20 20 20 70  ages.  The.    p
4ef0: 65 72 63 65 6e 74 61 67 65 20 61 74 20 74 68 65  ercentage at the
4f00: 20 72 69 67 68 74 20 69 73 20 74 68 65 20 6e 75   right is the nu
4f10: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
4f20: 79 74 65 73 20 64 69 76 69 64 65 64 20 62 79 20  ytes divided by 
4f30: 74 68 65 0a 20 20 20 20 74 6f 74 61 6c 20 6e 75  the.    total nu
4f40: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 6e  mber of bytes on
4f50: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
4f60: 0a 0a 55 6e 75 73 65 64 20 62 79 74 65 73 20 6f  ..Unused bytes o
4f70: 6e 20 61 6c 6c 20 70 61 67 65 73 0a 0a 20 20 20  n all pages..   
4f80: 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
4f90: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 75 6e  r of bytes of un
4fa0: 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 61 6c  used space on al
4fb0: 6c 20 70 72 69 6d 61 72 79 20 61 6e 64 20 6f 76  l primary and ov
4fc0: 65 72 66 6c 6f 77 20 0a 20 20 20 20 70 61 67 65  erflow .    page
4fd0: 73 2e 20 20 54 68 65 20 70 65 72 63 65 6e 74 61  s.  The percenta
4fe0: 67 65 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ge at the right 
4ff0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
5000: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 0a 20   unused bytes . 
5010: 20 20 20 64 69 76 69 64 65 64 20 62 79 20 74 68     divided by th
5020: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
5030: 66 20 62 79 74 65 73 2e 0a 7d 0a 0a 23 20 4f 75  f bytes..}..# Ou
5040: 74 70 75 74 20 74 68 65 20 64 61 74 61 62 61 73  tput the databas
5050: 65 0a 23 0a 70 75 74 73 20 22 2a 2a 2a 2a 2a 2a  e.#.puts "******
5060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
50a0: 22 0a 70 75 74 73 20 22 54 68 65 20 65 6e 74 69  ".puts "The enti
50b0: 72 65 20 74 65 78 74 20 6f 66 20 74 68 69 73 20  re text of this 
50c0: 72 65 70 6f 72 74 20 63 61 6e 20 62 65 20 73 6f  report can be so
50d0: 75 72 63 65 64 20 69 6e 74 6f 20 61 6e 79 20 53  urced into any S
50e0: 51 4c 20 64 61 74 61 62 61 73 65 22 0a 70 75 74  QL database".put
50f0: 73 20 22 65 6e 67 69 6e 65 20 66 6f 72 20 66 75  s "engine for fu
5100: 72 74 68 65 72 20 61 6e 61 6c 79 73 69 73 2e 20  rther analysis. 
5110: 20 41 6c 6c 20 6f 66 20 74 68 65 20 74 65 78 74   All of the text
5120: 20 61 62 6f 76 65 20 69 73 20 61 6e 20 53 51 4c   above is an SQL
5130: 20 63 6f 6d 6d 65 6e 74 2e 22 0a 70 75 74 73 20   comment.".puts 
5140: 22 54 68 65 20 64 61 74 61 20 75 73 65 64 20 74  "The data used t
5150: 6f 20 67 65 6e 65 72 61 74 65 20 74 68 69 73 20  o generate this 
5160: 72 65 70 6f 72 74 20 66 6f 6c 6c 6f 77 73 3a 22  report follows:"
5170: 0a 70 75 74 73 20 22 2a 2f 22 0a 70 75 74 73 20  .puts "*/".puts 
5180: 22 42 45 47 49 4e 3b 22 0a 70 75 74 73 20 24 74  "BEGIN;".puts $t
5190: 61 62 6c 65 64 65 66 0a 75 6e 73 65 74 20 2d 6e  abledef.unset -n
51a0: 6f 63 6f 6d 70 6c 61 69 6e 20 78 0a 6d 65 6d 20  ocomplain x.mem 
51b0: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46  eval {SELECT * F
51c0: 52 4f 4d 20 73 70 61 63 65 5f 75 73 65 64 7d 20  ROM space_used} 
51d0: 78 20 7b 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65  x {.  puts -none
51e0: 77 6c 69 6e 65 20 22 49 4e 53 45 52 54 20 49 4e  wline "INSERT IN
51f0: 54 4f 20 73 70 61 63 65 5f 75 73 65 64 20 56 41  TO space_used VA
5200: 4c 55 45 53 22 0a 20 20 73 65 74 20 73 65 70 20  LUES".  set sep 
5210: 28 0a 20 20 66 6f 72 65 61 63 68 20 63 6f 6c 20  (.  foreach col 
5220: 24 78 28 2a 29 20 7b 0a 20 20 20 20 73 65 74 20  $x(*) {.    set 
5230: 76 20 24 78 28 24 63 6f 6c 29 0a 20 20 20 20 69  v $x($col).    i
5240: 66 20 7b 24 76 3d 3d 22 22 20 7c 7c 20 21 5b 73  f {$v=="" || ![s
5250: 74 72 69 6e 67 20 69 73 20 64 6f 75 62 6c 65 20  tring is double 
5260: 24 76 5d 7d 20 7b 73 65 74 20 76 20 5b 71 75 6f  $v]} {set v [quo
5270: 74 65 20 24 76 5d 7d 0a 20 20 20 20 70 75 74 73  te $v]}.    puts
5280: 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 73 65 70   -nonewline $sep
5290: 24 76 0a 20 20 20 20 73 65 74 20 73 65 70 20 2c  $v.    set sep ,
52a0: 0a 20 20 7d 0a 20 20 70 75 74 73 20 22 29 3b 22  .  }.  puts ");"
52b0: 0a 7d 0a 70 75 74 73 20 22 43 4f 4d 4d 49 54 3b  .}.puts "COMMIT;
52c0: 22 0a                                            ".