Documentation Source Text

Hex Artifact Content
Login

Artifact 375a6d9570ae5d3010e6a2c0d36302e11bbdaa14:


0000: 3c 74 69 74 6c 65 3e 54 68 65 20 57 49 54 48 4f  <title>The WITHO
0010: 55 54 20 52 4f 57 49 44 20 4f 70 74 69 6d 69 7a  UT ROWID Optimiz
0020: 61 74 69 6f 6e 3c 2f 74 69 74 6c 65 3e 0a 3c 74  ation</title>.<t
0030: 63 6c 3e 0a 68 64 5f 6b 65 79 77 6f 72 64 73 20  cl>.hd_keywords 
0040: 7b 57 49 54 48 4f 55 54 20 72 6f 77 69 64 7d 20  {WITHOUT rowid} 
0050: 7b 57 49 54 48 4f 55 54 20 52 4f 57 49 44 7d 0a  {WITHOUT ROWID}.
0060: 3c 2f 74 63 6c 3e 0a 3c 68 31 20 61 6c 69 67 6e  </tcl>.<h1 align
0070: 3d 22 63 65 6e 74 65 72 22 3e 54 68 65 20 57 49  ="center">The WI
0080: 54 48 4f 55 54 20 52 4f 57 49 44 20 4f 70 74 69  THOUT ROWID Opti
0090: 6d 69 7a 61 74 69 6f 6e 3c 2f 68 31 3e 0a 0a 3c  mization</h1>..<
00a0: 68 32 3e 31 2e 30 20 49 6e 74 72 6f 64 75 63 74  h2>1.0 Introduct
00b0: 69 6f 6e 3c 2f 68 32 3e 0a 0a 3c 70 3e 5e 42 79  ion</h2>..<p>^By
00c0: 20 64 65 66 61 75 6c 74 2c 20 65 76 65 72 79 20   default, every 
00d0: 72 6f 77 20 69 6e 20 53 51 4c 69 74 65 20 68 61  row in SQLite ha
00e0: 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6c 75  s a special colu
00f0: 6d 6e 2c 20 75 73 75 61 6c 6c 79 20 63 61 6c 6c  mn, usually call
0100: 65 64 20 74 68 65 0a 22 5b 72 6f 77 69 64 5d 22  ed the."[rowid]"
0110: 2c 20 74 68 61 74 20 75 6e 69 71 75 65 6c 79 20  , that uniquely 
0120: 69 64 65 6e 74 69 66 69 65 73 20 74 68 61 74 20  identifies that 
0130: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
0140: 61 62 6c 65 2e 20 20 5e 48 6f 77 65 76 65 72 0a  able.  ^However.
0150: 69 66 20 74 68 65 20 70 68 72 61 73 65 20 22 57  if the phrase "W
0160: 49 54 48 4f 55 54 20 52 4f 57 49 44 22 20 69 73  ITHOUT ROWID" is
0170: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e   added to the en
0180: 64 20 6f 66 20 61 20 5b 43 52 45 41 54 45 20 54  d of a [CREATE T
0190: 41 42 4c 45 5d 20 73 74 61 74 65 6d 65 6e 74 2c  ABLE] statement,
01a0: 0a 74 68 65 6e 20 74 68 65 20 73 70 65 63 69 61  .then the specia
01b0: 6c 20 22 72 6f 77 69 64 22 20 63 6f 6c 75 6d 6e  l "rowid" column
01c0: 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 54 68   is omitted.  Th
01d0: 65 72 65 20 61 72 65 20 73 6f 6d 65 74 69 6d 65  ere are sometime
01e0: 73 0a 73 70 61 63 65 20 61 6e 64 20 70 65 72 66  s.space and perf
01f0: 6f 72 6d 61 6e 63 65 20 61 64 76 61 6e 74 61 67  ormance advantag
0200: 65 73 20 74 6f 20 6f 6d 69 74 74 69 6e 67 20 74  es to omitting t
0210: 68 65 20 72 6f 77 69 64 2e 3c 2f 70 3e 0a 0a 3c  he rowid.</p>..<
0220: 68 33 3e 31 2e 31 20 53 79 6e 74 61 78 3c 2f 68  h3>1.1 Syntax</h
0230: 33 3e 0a 0a 3c 70 3e 5e 28 54 6f 20 63 72 65 61  3>..<p>^(To crea
0240: 74 65 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  te a WITHOUT ROW
0250: 49 44 20 74 61 62 6c 65 2c 20 73 69 6d 70 6c 79  ID table, simply
0260: 20 61 64 64 20 74 68 65 20 6b 65 79 77 6f 72 64   add the keyword
0270: 73 20 22 57 49 54 48 4f 55 54 20 52 4f 57 49 44  s "WITHOUT ROWID
0280: 22 0a 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  ".to the end of 
0290: 74 68 65 20 5b 43 52 45 41 54 45 20 54 41 42 4c  the [CREATE TABL
02a0: 45 5d 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 46  E] statement.  F
02b0: 6f 72 20 65 78 61 6d 70 6c 65 3a 3c 2f 70 3e 0a  or example:</p>.
02c0: 0a 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72  .<blockquote><pr
02d0: 65 3e 0a 43 52 45 41 54 45 20 54 41 42 4c 45 20  e>.CREATE TABLE 
02e0: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 77 6f  IF NOT EXISTS wo
02f0: 72 64 63 6f 75 6e 74 28 0a 20 20 77 6f 72 64 20  rdcount(.  word 
0300: 54 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59  TEXT PRIMARY KEY
0310: 2c 0a 20 20 63 6e 74 20 49 4e 54 45 47 45 52 0a  ,.  cnt INTEGER.
0320: 29 20 3c 62 3e 57 49 54 48 4f 55 54 20 52 4f 57  ) <b>WITHOUT ROW
0330: 49 44 3c 2f 62 3e 3b 0a 3c 2f 70 72 65 3e 3c 2f  ID</b>;.</pre></
0340: 62 6c 6f 63 6b 71 75 6f 74 65 3e 29 5e 0a 0a 3c  blockquote>)^..<
0350: 70 3e 5e 28 41 73 20 77 69 74 68 20 61 6c 6c 20  p>^(As with all 
0360: 53 51 4c 20 73 79 6e 74 61 78 2c 20 74 68 65 20  SQL syntax, the 
0370: 63 61 73 65 20 6f 66 20 74 68 65 20 6b 65 79 77  case of the keyw
0380: 6f 72 64 73 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ords does not ma
0390: 74 74 65 72 2e 20 20 0a 4f 6e 65 20 63 61 6e 20  tter.  .One can 
03a0: 77 72 69 74 65 20 22 57 49 54 48 4f 55 54 20 72  write "WITHOUT r
03b0: 6f 77 69 64 22 20 6f 72 20 22 77 69 74 68 6f 75  owid" or "withou
03c0: 74 20 72 6f 77 69 64 22 20 6f 72 20 22 57 69 54  t rowid" or "WiT
03d0: 68 4f 75 54 20 72 4f 77 49 64 22 20 61 6e 64 0a  hOuT rOwId" and.
03e0: 69 74 20 77 69 6c 6c 20 6d 65 61 6e 20 74 68 65  it will mean the
03f0: 20 73 61 6d 65 20 74 68 69 6e 67 2e 29 5e 3c 2f   same thing.)^</
0400: 70 3e 0a 0a 3c 70 3e 45 76 65 72 79 20 57 49 54  p>..<p>Every WIT
0410: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
0420: 20 6d 75 73 74 20 68 61 76 65 20 61 20 5b 50 52   must have a [PR
0430: 49 4d 41 52 59 20 4b 45 59 5d 2e 20 20 5e 41 6e  IMARY KEY].  ^An
0440: 20 65 72 72 6f 72 20 69 73 20 72 61 69 73 65 64   error is raised
0450: 0a 69 66 20 61 20 43 52 45 41 54 45 20 54 41 42  .if a CREATE TAB
0460: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  LE statement wit
0470: 68 20 74 68 65 20 57 49 54 48 4f 55 54 20 52 4f  h the WITHOUT RO
0480: 57 49 44 20 63 6c 61 75 73 65 20 6c 61 63 6b 73  WID clause lacks
0490: 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a   a PRIMARY KEY..
04a0: 0a 3c 70 3e 49 6e 20 6d 6f 73 74 20 63 6f 6e 74  .<p>In most cont
04b0: 65 78 74 73 2c 20 74 68 65 20 73 70 65 63 69 61  exts, the specia
04c0: 6c 20 22 72 6f 77 69 64 22 20 63 6f 6c 75 6d 6e  l "rowid" column
04d0: 20 6f 66 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65   of normal table
04e0: 73 20 63 61 6e 20 0a 61 6c 73 6f 20 62 65 20 63  s can .also be c
04f0: 61 6c 6c 65 64 20 22 6f 69 64 22 20 6f 72 20 22  alled "oid" or "
0500: 5f 72 6f 77 69 64 5f 22 2e 20 20 5e 48 6f 77 65  _rowid_".  ^Howe
0510: 76 65 72 2c 20 6f 6e 6c 79 20 22 72 6f 77 69 64  ver, only "rowid
0520: 22 20 77 6f 72 6b 73 20 61 73 20 0a 74 68 65 20  " works as .the 
0530: 6b 65 79 77 6f 72 64 20 69 6e 20 74 68 65 20 43  keyword in the C
0540: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
0550: 65 6d 65 6e 74 2e 3c 2f 70 3e 0a 0a 3c 68 33 3e  ement.</p>..<h3>
0560: 31 2e 32 20 43 6f 6d 70 61 74 69 62 69 6c 69 74  1.2 Compatibilit
0570: 79 3c 2f 68 33 3e 0a 0a 3c 70 3e 53 51 4c 69 74  y</h3>..<p>SQLit
0580: 65 20 5b 76 65 72 73 69 6f 6e 20 33 2e 38 2e 32  e [version 3.8.2
0590: 5d 20 6f 72 20 6c 61 74 65 72 20 69 73 20 6e 65  ] or later is ne
05a0: 63 65 73 73 61 72 79 20 69 6e 20 6f 72 64 65 72  cessary in order
05b0: 20 74 6f 20 75 73 65 20 61 20 57 49 54 48 4f 55   to use a WITHOU
05c0: 54 0a 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 20  T.ROWID table.  
05d0: 41 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 70  An attempt to op
05e0: 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68  en a database th
05f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  at contains one 
0600: 6f 72 20 6d 6f 72 65 20 57 49 54 48 4f 55 54 0a  or more WITHOUT.
0610: 52 4f 57 49 44 20 74 61 62 6c 65 73 20 75 73 69  ROWID tables usi
0620: 6e 67 20 61 6e 20 65 61 72 6c 69 65 72 20 76 65  ng an earlier ve
0630: 72 73 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 20  rsion of SQLite 
0640: 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
0650: 0a 22 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61  ."malformed data
0660: 62 61 73 65 20 73 63 68 65 6d 61 22 20 65 72 72  base schema" err
0670: 6f 72 2e 3c 2f 70 3e 0a 0a 3c 68 32 3e 32 2e 30  or.</p>..<h2>2.0
0680: 20 44 69 66 66 65 72 65 6e 63 65 73 20 46 72 6f   Differences Fro
0690: 6d 20 4f 72 64 69 6e 61 72 79 20 52 6f 77 69 64  m Ordinary Rowid
06a0: 20 54 61 62 6c 65 73 3c 2f 68 32 3e 0a 0a 3c 70   Tables</h2>..<p
06b0: 3e 54 68 65 20 57 49 54 48 4f 55 54 20 52 4f 57  >The WITHOUT ROW
06c0: 49 44 20 73 79 6e 74 61 78 20 69 73 20 61 6e 20  ID syntax is an 
06d0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
06e0: 74 20 70 72 6f 76 69 64 65 73 20 6e 6f 20 6e 65  t provides no ne
06f0: 77 0a 63 61 70 61 62 69 6c 69 74 69 65 73 2e 20  w.capabilities. 
0700: 20 41 6e 79 74 68 69 6e 67 20 74 68 61 74 20 63   Anything that c
0710: 61 6e 20 62 65 20 64 6f 6e 65 20 75 73 69 6e 67  an be done using
0720: 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
0730: 20 74 61 62 6c 65 0a 63 61 6e 20 61 6c 73 6f 20   table.can also 
0740: 62 65 20 64 6f 6e 65 20 69 6e 20 65 78 61 63 74  be done in exact
0750: 6c 79 20 74 68 65 20 73 61 6d 65 20 77 61 79 2c  ly the same way,
0760: 20 61 6e 64 20 65 78 61 63 74 6c 79 20 74 68 65   and exactly the
0770: 20 73 61 6d 65 20 73 79 6e 74 61 78 2c 0a 75 73   same syntax,.us
0780: 69 6e 67 20 61 6e 20 6f 72 64 69 6e 61 72 79 20  ing an ordinary 
0790: 72 6f 77 69 64 20 74 61 62 6c 65 2e 20 20 54 68  rowid table.  Th
07a0: 65 20 6f 6e 6c 79 20 61 64 76 61 6e 74 61 67 65  e only advantage
07b0: 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f   of a WITHOUT RO
07c0: 57 49 44 0a 74 61 62 6c 65 20 69 73 20 74 68 61  WID.table is tha
07d0: 74 20 69 74 20 63 61 6e 20 73 6f 6d 65 74 69 6d  t it can sometim
07e0: 65 73 20 75 73 65 20 6c 65 73 73 20 64 69 73 6b  es use less disk
07f0: 20 73 70 61 63 65 20 61 6e 64 2f 6f 72 20 70 65   space and/or pe
0800: 72 66 6f 72 6d 20 61 20 6c 69 74 74 6c 65 0a 66  rform a little.f
0810: 61 73 74 65 72 20 74 68 61 6e 20 61 6e 20 6f 72  aster than an or
0820: 64 69 6e 61 72 79 20 72 6f 77 69 64 20 74 61 62  dinary rowid tab
0830: 6c 65 2e 3c 2f 70 3e 0a 0a 3c 70 3e 46 6f 72 20  le.</p>..<p>For 
0840: 74 68 65 20 6d 6f 73 74 20 70 61 72 74 2c 20 6f  the most part, o
0850: 72 64 69 6e 61 72 79 20 72 6f 77 69 64 20 74 61  rdinary rowid ta
0860: 62 6c 65 73 20 61 6e 64 20 57 49 54 48 4f 55 54  bles and WITHOUT
0870: 20 52 4f 57 49 44 20 74 61 62 6c 65 73 0a 61 72   ROWID tables.ar
0880: 65 20 69 6e 74 65 72 63 68 61 6e 67 65 61 62 6c  e interchangeabl
0890: 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 72  e.  But there ar
08a0: 65 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  e some additiona
08b0: 6c 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f  l restrictions o
08c0: 6e 0a 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  n.WITHOUT ROWID 
08d0: 74 61 62 6c 65 73 20 74 68 61 74 20 64 6f 20 6e  tables that do n
08e0: 6f 74 20 61 70 70 6c 79 20 74 6f 20 6f 72 64 69  ot apply to ordi
08f0: 6e 61 72 79 20 72 6f 77 69 64 20 74 61 62 6c 65  nary rowid table
0900: 73 3a 3c 2f 70 3e 0a 0a 3c 6f 6c 3e 0a 3c 6c 69  s:</p>..<ol>.<li
0910: 3e 3c 70 3e 0a 3c 62 3e 5e 45 76 65 72 79 20 57  ><p>.<b>^Every W
0920: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
0930: 6c 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 50  le must have a P
0940: 52 49 4d 41 52 59 20 4b 45 59 2e 3c 2f 62 3e 0a  RIMARY KEY.</b>.
0950: 5e 41 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 63  ^An attempt to c
0960: 72 65 61 74 65 20 61 20 57 49 54 48 4f 55 54 20  reate a WITHOUT 
0970: 52 4f 57 49 44 20 74 61 62 6c 65 20 77 69 74 68  ROWID table with
0980: 6f 75 74 20 61 20 50 52 49 4d 41 52 59 20 4b 45  out a PRIMARY KE
0990: 59 20 72 65 73 75 6c 74 73 0a 69 6e 20 61 6e 20  Y results.in an 
09a0: 65 72 72 6f 72 2e 0a 0a 3c 6c 69 3e 3c 70 3e 0a  error...<li><p>.
09b0: 3c 62 3e 5e 54 68 65 20 73 70 65 63 69 61 6c 20  <b>^The special 
09c0: 62 65 68 61 76 69 6f 72 73 20 61 73 73 6f 63 69  behaviors associ
09d0: 61 74 65 64 20 22 5b 49 4e 54 45 47 45 52 20 50  ated "[INTEGER P
09e0: 52 49 4d 41 52 59 20 4b 45 59 5d 22 20 64 6f 20  RIMARY KEY]" do 
09f0: 6e 6f 74 20 61 70 70 6c 79 0a 6f 6e 20 57 49 54  not apply.on WIT
0a00: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
0a10: 73 2e 3c 2f 62 3e 0a 49 6e 20 61 6e 20 6f 72 64  s.</b>.In an ord
0a20: 69 6e 61 72 79 20 74 61 62 6c 65 2c 20 22 49 4e  inary table, "IN
0a30: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
0a40: 59 22 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  Y" means that th
0a50: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 61 6e 0a 61  e column is an.a
0a60: 6c 69 61 73 20 66 6f 72 20 74 68 65 20 72 6f 77  lias for the row
0a70: 69 64 2e 20 20 42 75 74 20 73 69 6e 63 65 20 74  id.  But since t
0a80: 68 65 72 65 20 69 73 20 6e 6f 20 72 6f 77 69 64  here is no rowid
0a90: 20 69 6e 20 61 20 57 49 54 48 4f 55 54 20 52 4f   in a WITHOUT RO
0aa0: 57 49 44 0a 74 61 62 6c 65 2c 20 74 68 61 74 20  WID.table, that 
0ab0: 73 70 65 63 69 61 6c 20 6d 65 61 6e 69 6e 67 20  special meaning 
0ac0: 6e 6f 20 6c 6f 6e 67 65 72 20 61 70 70 6c 69 65  no longer applie
0ad0: 73 2e 20 20 41 6e 20 22 49 4e 54 45 47 45 52 20  s.  An "INTEGER 
0ae0: 50 52 49 4d 41 52 59 20 4b 45 59 22 20 77 6f 72  PRIMARY KEY" wor
0af0: 6b 73 0a 6c 69 6b 65 20 61 6e 20 22 49 4e 54 20  ks.like an "INT 
0b00: 50 52 49 4d 41 52 59 20 4b 45 59 22 20 69 6e 20  PRIMARY KEY" in 
0b10: 61 6e 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c  an ordinary tabl
0b20: 65 3a 20 49 74 20 69 73 20 61 20 50 52 49 4d 41  e: It is a PRIMA
0b30: 52 59 20 4b 45 59 0a 74 68 61 74 20 68 61 73 20  RY KEY.that has 
0b40: 69 6e 74 65 67 65 72 20 5b 61 66 66 69 6e 69 74  integer [affinit
0b50: 79 5d 2e 0a 0a 3c 6c 69 3e 3c 70 3e 0a 3c 62 3e  y]...<li><p>.<b>
0b60: 5e 5b 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 5d  ^[AUTOINCREMENT]
0b70: 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
0b80: 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  n WITHOUT ROWID 
0b90: 74 61 62 6c 65 73 2e 3c 2f 62 3e 0a 54 68 65 20  tables.</b>.The 
0ba0: 5b 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 5d 20  [AUTOINCREMENT] 
0bb0: 6d 65 63 68 61 6e 69 73 6d 20 61 73 73 75 6d 65  mechanism assume
0bc0: 73 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  s the presence o
0bd0: 66 20 61 20 72 6f 77 69 64 20 61 6e 64 20 73 6f  f a rowid and so
0be0: 20 69 74 0a 64 6f 65 73 20 6e 6f 74 20 77 6f 72   it.does not wor
0bf0: 6b 20 6f 6e 20 61 20 57 49 54 48 4f 55 54 20 52  k on a WITHOUT R
0c00: 4f 57 49 44 20 74 61 62 6c 65 2e 20 20 5e 41 6e  OWID table.  ^An
0c10: 20 65 72 72 6f 72 20 69 73 20 72 61 69 73 65 64   error is raised
0c20: 20 69 66 20 74 68 65 0a 20 22 41 55 54 4f 49 4e   if the. "AUTOIN
0c30: 43 52 45 4d 45 4e 54 22 20 6b 65 79 77 6f 72 64  CREMENT" keyword
0c40: 20 69 73 20 75 73 65 64 20 69 6e 20 74 68 65 20   is used in the 
0c50: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
0c60: 74 65 6d 65 6e 74 20 66 6f 72 0a 61 20 57 49 54  tement for.a WIT
0c70: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
0c80: 2e 0a 0a 3c 6c 69 3e 3c 70 3e 0a 3c 62 3e 5e 4e  ...<li><p>.<b>^N
0c90: 4f 54 20 4e 55 4c 4c 20 69 73 20 65 6e 66 6f 72  OT NULL is enfor
0ca0: 63 65 64 20 6f 6e 20 65 76 65 72 79 20 63 6f 6c  ced on every col
0cb0: 75 6d 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41  umn of the PRIMA
0cc0: 52 59 20 4b 45 59 20 69 6e 20 61 20 57 49 54 48  RY KEY in a WITH
0cd0: 4f 55 54 0a 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT.ROWID table.
0ce0: 3c 2f 62 3e 0a 54 68 69 73 20 69 73 20 69 6e 20  </b>.This is in 
0cf0: 61 63 63 6f 72 64 61 6e 63 65 20 77 69 74 68 20  accordance with 
0d00: 74 68 65 20 53 51 4c 20 73 74 61 6e 64 61 72 64  the SQL standard
0d10: 2e 20 20 45 61 63 68 20 63 6f 6c 75 6d 6e 20 6f  .  Each column o
0d20: 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 0a  f a PRIMARY KEY.
0d30: 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20 62  is supposed to b
0d40: 65 20 69 6e 64 69 76 69 64 75 61 6c 6c 79 20 4e  e individually N
0d50: 4f 54 20 4e 55 4c 4c 2e 20 20 48 6f 77 65 76 65  OT NULL.  Howeve
0d60: 72 2c 20 4e 4f 54 20 4e 55 4c 4c 20 77 61 73 20  r, NOT NULL was 
0d70: 6e 6f 74 20 65 6e 66 6f 72 63 65 64 0a 6f 6e 20  not enforced.on 
0d80: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
0d90: 6d 6e 73 20 62 79 20 65 61 72 6c 79 20 76 65 72  mns by early ver
0da0: 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
0db0: 64 75 65 20 74 6f 20 61 20 62 75 67 2e 20 20 42  due to a bug.  B
0dc0: 79 20 74 68 65 0a 74 69 6d 65 20 74 68 61 74 20  y the.time that 
0dd0: 74 68 69 73 20 62 75 67 20 77 61 73 20 64 69 73  this bug was dis
0de0: 63 6f 76 65 72 65 64 2c 20 73 6f 20 6d 61 6e 79  covered, so many
0df0: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
0e00: 73 20 77 65 72 65 20 61 6c 72 65 61 64 79 0a 69  s were already.i
0e10: 6e 20 63 69 72 63 75 6c 61 74 69 6f 6e 20 74 68  n circulation th
0e20: 61 74 20 74 68 65 20 64 65 63 69 73 69 6f 6e 20  at the decision 
0e30: 77 61 73 20 6d 61 64 65 20 6e 6f 74 20 74 6f 20  was made not to 
0e40: 66 69 78 20 74 68 69 73 20 62 75 67 20 66 6f 72  fix this bug for
0e50: 20 66 65 61 72 20 6f 66 0a 62 72 65 61 6b 69 6e   fear of.breakin
0e60: 67 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e  g compatibility.
0e70: 20 20 5e 53 6f 2c 20 6f 72 64 69 6e 61 72 79 20    ^So, ordinary 
0e80: 72 6f 77 69 64 20 74 61 62 6c 65 73 20 69 6e 20  rowid tables in 
0e90: 53 51 4c 69 74 65 20 76 69 6f 6c 61 74 65 20 74  SQLite violate t
0ea0: 68 65 0a 53 51 4c 20 73 74 61 6e 64 61 72 64 20  he.SQL standard 
0eb0: 61 6e 64 20 61 6c 6c 6f 77 20 4e 55 4c 4c 20 76  and allow NULL v
0ec0: 61 6c 75 65 73 20 69 6e 20 50 52 49 4d 41 52 59  alues in PRIMARY
0ed0: 20 4b 45 59 20 66 69 65 6c 64 73 2e 20 20 5e 42   KEY fields.  ^B
0ee0: 75 74 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  ut WITHOUT ROWID
0ef0: 0a 74 61 62 6c 65 73 20 64 6f 20 66 6f 6c 6c 6f  .tables do follo
0f00: 77 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 61  w the standard a
0f10: 6e 64 20 77 69 6c 6c 20 74 68 72 6f 77 20 61 6e  nd will throw an
0f20: 20 65 72 72 6f 72 20 6f 6e 20 61 6e 79 20 61 74   error on any at
0f30: 74 65 6d 70 74 20 74 6f 0a 69 6e 73 65 72 74 20  tempt to.insert 
0f40: 61 20 4e 55 4c 4c 20 69 6e 74 6f 20 61 20 50 52  a NULL into a PR
0f50: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
0f60: 2e 0a 0a 3c 6c 69 3e 3c 70 3e 0a 3c 62 3e 5e 54  ...<li><p>.<b>^T
0f70: 68 65 20 5b 73 71 6c 69 74 65 33 5f 6c 61 73 74  he [sqlite3_last
0f80: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 29 5d  _insert_rowid()]
0f90: 20 66 75 6e 63 74 69 6f 6e 0a 64 6f 65 73 20 6e   function.does n
0fa0: 6f 74 20 77 6f 72 6b 20 66 6f 72 20 57 49 54 48  ot work for WITH
0fb0: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73  OUT ROWID tables
0fc0: 2e 3c 2f 62 3e 0a 49 6e 73 65 72 74 73 20 69 6e  .</b>.Inserts in
0fd0: 74 6f 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  to a WITHOUT ROW
0fe0: 49 44 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65  ID do not change
0ff0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
1000: 6e 65 64 20 62 79 20 74 68 65 0a 5b 73 71 6c 69  ned by the.[sqli
1010: 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  te3_last_insert_
1020: 72 6f 77 69 64 28 29 5d 20 66 75 6e 63 74 69 6f  rowid()] functio
1030: 6e 2e 20 20 54 68 65 20 5b 6c 61 73 74 5f 69 6e  n.  The [last_in
1040: 73 65 72 74 5f 72 6f 77 69 64 28 29 5d 20 53 51  sert_rowid()] SQ
1050: 4c 0a 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c  L.function is al
1060: 73 6f 20 75 6e 61 66 66 65 63 74 65 64 20 73 69  so unaffected si
1070: 6e 63 65 20 69 74 20 69 73 20 6a 75 73 74 20 61  nce it is just a
1080: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 0a   wrapper around.
1090: 5b 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e  [sqlite3_last_in
10a0: 73 65 72 74 5f 72 6f 77 69 64 28 29 5d 2e 0a 0a  sert_rowid()]...
10b0: 3c 6c 69 3e 3c 70 3e 0a 3c 62 3e 5e 54 68 65 20  <li><p>.<b>^The 
10c0: 5b 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70  [sqlite3_blob_op
10d0: 65 6e 20 7c 20 69 6e 63 72 65 6d 65 6e 74 61 6c  en | incremental
10e0: 20 62 6c 6f 62 20 49 2f 4f 5d 20 6d 65 63 68 61   blob I/O] mecha
10f0: 6e 69 73 6d 20 64 6f 65 73 20 6e 6f 74 20 77 6f  nism does not wo
1100: 72 6b 0a 66 6f 72 20 57 49 54 48 4f 55 54 20 52  rk.for WITHOUT R
1110: 4f 57 49 44 20 74 61 62 6c 65 73 2e 3c 2f 62 3e  OWID tables.</b>
1120: 0a 49 6e 63 72 65 6d 65 6e 74 61 6c 20 42 4c 4f  .Incremental BLO
1130: 42 20 49 2f 4f 20 75 73 65 73 20 74 68 65 20 72  B I/O uses the r
1140: 6f 77 69 64 20 74 6f 20 63 72 65 61 74 65 20 61  owid to create a
1150: 6e 20 5b 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5d  n [sqlite3_blob]
1160: 20 6f 62 6a 65 63 74 20 66 6f 72 0a 64 6f 69 6e   object for.doin
1170: 67 20 74 68 65 20 64 69 72 65 63 74 20 49 2f 4f  g the direct I/O
1180: 2e 20 20 48 6f 77 65 76 65 72 2c 20 57 49 54 48  .  However, WITH
1190: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73  OUT ROWID tables
11a0: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72   do not have a r
11b0: 6f 77 69 64 2c 0a 61 6e 64 20 73 6f 20 74 68 65  owid,.and so the
11c0: 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20  re is no way to 
11d0: 63 72 65 61 74 65 20 61 6e 20 5b 73 71 6c 69 74  create an [sqlit
11e0: 65 33 5f 62 6c 6f 62 5d 20 6f 62 6a 65 63 74 20  e3_blob] object 
11f0: 66 6f 72 20 61 20 57 49 54 48 4f 55 54 0a 52 4f  for a WITHOUT.RO
1200: 57 49 44 20 74 61 62 6c 65 2e 0a 0a 3c 6c 69 3e  WID table...<li>
1210: 3c 70 3e 0a 3c 62 3e 5e 54 68 65 20 5b 73 71 6c  <p>.<b>^The [sql
1220: 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b  ite3_update_hook
1230: 28 29 5d 20 69 6e 74 65 72 66 61 63 65 20 64 6f  ()] interface do
1240: 65 73 20 6e 6f 74 20 66 69 72 65 20 63 61 6c 6c  es not fire call
1250: 62 61 63 6b 73 20 66 6f 72 20 63 68 61 6e 67 65  backs for change
1260: 73 0a 74 6f 20 61 20 57 49 54 48 4f 55 54 20 52  s.to a WITHOUT R
1270: 4f 57 49 44 20 74 61 62 6c 65 2e 3c 2f 62 3e 0a  OWID table.</b>.
1280: 50 61 72 74 20 6f 66 20 74 68 65 20 63 61 6c 6c  Part of the call
1290: 62 61 63 6b 20 66 72 6f 6d 20 5b 73 71 6c 69 74  back from [sqlit
12a0: 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 29  e3_update_hook()
12b0: 5d 20 69 73 20 74 68 65 20 72 6f 77 69 64 20 6f  ] is the rowid o
12c0: 66 20 74 68 65 20 74 61 62 6c 65 0a 72 6f 77 20  f the table.row 
12d0: 74 68 61 74 20 68 61 73 20 63 68 61 6e 67 65 64  that has changed
12e0: 2e 20 20 48 6f 77 65 76 65 72 2c 20 57 49 54 48  .  However, WITH
12f0: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73  OUT ROWID tables
1300: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72   do not have a r
1310: 6f 77 69 64 2e 0a 48 65 6e 63 65 2c 20 74 68 65  owid..Hence, the
1320: 20 75 70 64 61 74 65 20 68 6f 6f 6b 20 69 73 20   update hook is 
1330: 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e  not invoked when
1340: 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
1350: 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73 2e 0a   table changes..
1360: 3c 70 3e 4e 6f 74 65 20 74 68 61 74 20 73 69 6e  <p>Note that sin
1370: 63 65 20 74 68 65 20 5b 73 65 73 73 69 6f 6e 5d  ce the [session]
1380: 20 65 78 74 65 6e 73 69 6f 6e 20 75 73 65 73 20   extension uses 
1390: 74 68 65 20 75 70 64 61 74 65 20 68 6f 6f 6b 2c  the update hook,
13a0: 20 74 68 61 74 20 6d 65 61 6e 73 0a 74 68 61 74   that means.that
13b0: 20 74 68 65 20 73 65 73 73 69 6f 6e 20 65 78 74   the session ext
13c0: 65 6e 73 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 20  ension will not 
13d0: 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f  work correctly o
13e0: 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61  n a database tha
13f0: 74 20 69 6e 63 6c 75 64 65 73 0a 57 49 54 48 4f  t includes.WITHO
1400: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 2e  UT ROWID tables.
1410: 0a 3c 2f 6f 6c 3e 0a 0a 3c 68 32 3e 33 2e 30 20  .</ol>..<h2>3.0 
1420: 42 65 6e 65 66 69 74 73 20 4f 66 20 57 49 54 48  Benefits Of WITH
1430: 4f 55 54 20 52 4f 57 49 44 20 54 61 62 6c 65 73  OUT ROWID Tables
1440: 3c 2f 68 32 3e 0a 0a 3c 70 3e 41 20 57 49 54 48  </h2>..<p>A WITH
1450: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20  OUT ROWID table 
1460: 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
1470: 6f 6e 20 74 68 61 74 20 63 61 6e 20 72 65 64 75  on that can redu
1480: 63 65 20 73 74 6f 72 61 67 65 20 61 6e 64 0a 70  ce storage and.p
1490: 72 6f 63 65 73 73 69 6e 67 20 72 65 71 75 69 72  rocessing requir
14a0: 65 6d 65 6e 74 73 2e 0a 0a 3c 70 3e 49 6e 20 61  ements...<p>In a
14b0: 6e 20 6f 72 64 69 6e 61 72 79 20 53 51 4c 69 74  n ordinary SQLit
14c0: 65 20 74 61 62 6c 65 2c 20 74 68 65 20 50 52 49  e table, the PRI
14d0: 4d 41 52 59 20 4b 45 59 20 69 73 20 72 65 61 6c  MARY KEY is real
14e0: 6c 79 20 6a 75 73 74 20 61 20 0a 5b 55 4e 49 51  ly just a .[UNIQ
14f0: 55 45 5d 20 69 6e 64 65 78 2e 20 20 54 68 65 20  UE] index.  The 
1500: 6b 65 79 20 75 73 65 64 20 74 6f 20 6c 6f 6f 6b  key used to look
1510: 20 75 70 20 72 65 63 6f 72 64 73 20 6f 6e 20 64   up records on d
1520: 69 73 6b 0a 69 73 20 74 68 65 20 5b 72 6f 77 69  isk.is the [rowi
1530: 64 5d 2e 0a 54 68 65 20 73 70 65 63 69 61 6c 20  d]..The special 
1540: 22 5b 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  "[INTEGER PRIMAR
1550: 59 20 4b 45 59 5d 22 20 63 6f 6c 75 6d 6e 20 74  Y KEY]" column t
1560: 79 70 65 20 69 6e 20 6f 72 64 69 6e 61 72 79 20  ype in ordinary 
1570: 53 51 4c 69 74 65 20 74 61 62 6c 65 73 20 0a 63  SQLite tables .c
1580: 61 75 73 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e  auses the column
1590: 20 74 6f 20 62 65 20 61 6e 20 61 6c 69 61 73 20   to be an alias 
15a0: 66 6f 72 20 74 68 65 20 72 6f 77 69 64 2c 20 61  for the rowid, a
15b0: 6e 64 20 73 6f 20 61 6e 20 49 4e 54 45 47 45 52  nd so an INTEGER
15c0: 20 50 52 49 4d 41 52 59 0a 4b 45 59 20 69 73 20   PRIMARY.KEY is 
15d0: 61 20 74 72 75 65 20 50 52 49 4d 41 52 59 20 4b  a true PRIMARY K
15e0: 45 59 2e 20 20 42 75 74 20 61 6e 79 20 6f 74 68  EY.  But any oth
15f0: 65 72 20 6b 69 6e 64 20 6f 66 20 50 52 49 4d 41  er kind of PRIMA
1600: 52 59 20 4b 45 59 73 2c 20 69 6e 63 6c 75 64 69  RY KEYs, includi
1610: 6e 67 0a 22 49 4e 54 20 50 52 49 4d 41 52 59 20  ng."INT PRIMARY 
1620: 4b 45 59 22 20 61 72 65 20 6a 75 73 74 20 75 6e  KEY" are just un
1630: 69 71 75 65 20 69 6e 64 65 78 65 73 20 69 6e 20  ique indexes in 
1640: 61 6e 20 6f 72 64 69 6e 61 72 79 20 72 6f 77 69  an ordinary rowi
1650: 64 20 74 61 62 6c 65 2e 3c 2f 70 3e 0a 0a 3c 70  d table.</p>..<p
1660: 3e 43 6f 6e 73 69 64 65 72 20 61 20 74 61 62 6c  >Consider a tabl
1670: 65 20 28 73 68 6f 77 6e 20 62 65 6c 6f 77 29 20  e (shown below) 
1680: 69 6e 74 65 6e 64 65 64 20 74 6f 20 73 74 6f 72  intended to stor
1690: 65 20 61 0a 76 6f 63 61 62 75 6c 61 72 79 20 6f  e a.vocabulary o
16a0: 66 20 77 6f 72 64 73 20 74 6f 67 65 74 68 65 72  f words together
16b0: 20 77 69 74 68 20 61 20 63 6f 75 6e 74 20 6f 66   with a count of
16c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
16d0: 63 63 75 72 72 65 6e 63 65 73 20 6f 66 0a 65 61  ccurrences of.ea
16e0: 63 68 20 77 6f 72 64 20 69 6e 20 73 6f 6d 65 20  ch word in some 
16f0: 74 65 78 74 20 63 6f 72 70 75 73 3a 0a 0a 3c 62  text corpus:..<b
1700: 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a  lockquote><pre>.
1710: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20  CREATE TABLE IF 
1720: 4e 4f 54 20 45 58 49 53 54 53 20 77 6f 72 64 63  NOT EXISTS wordc
1730: 6f 75 6e 74 28 0a 20 20 77 6f 72 64 20 54 45 58  ount(.  word TEX
1740: 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20  T PRIMARY KEY,. 
1750: 20 63 6e 74 20 49 4e 54 45 47 45 52 0a 29 3b 0a   cnt INTEGER.);.
1760: 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f  </pre></blockquo
1770: 74 65 3e 0a 0a 3c 70 3e 41 73 20 61 6e 20 6f 72  te>..<p>As an or
1780: 64 69 6e 61 72 79 20 53 51 4c 69 74 65 20 74 61  dinary SQLite ta
1790: 62 6c 65 2c 20 22 77 6f 72 64 63 6f 75 6e 74 22  ble, "wordcount"
17a0: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
17b0: 61 73 20 74 77 6f 0a 73 65 70 61 72 61 74 65 20  as two.separate 
17c0: 42 2d 54 72 65 65 73 2e 20 20 54 68 65 20 6d 61  B-Trees.  The ma
17d0: 69 6e 20 74 61 62 6c 65 20 75 73 65 73 20 74 68  in table uses th
17e0: 65 20 68 69 64 64 65 6e 20 72 6f 77 69 64 20 76  e hidden rowid v
17f0: 61 6c 75 65 20 61 73 20 74 68 65 20 6b 65 79 0a  alue as the key.
1800: 61 6e 64 20 73 74 6f 72 65 73 20 74 68 65 20 22  and stores the "
1810: 77 6f 72 64 22 20 61 6e 64 20 22 63 6e 74 22 20  word" and "cnt" 
1820: 63 6f 6c 75 6d 6e 73 20 61 73 20 64 61 74 61 2e  columns as data.
1830: 20 20 54 68 65 20 22 54 45 58 54 20 50 52 49 4d    The "TEXT PRIM
1840: 41 52 59 20 4b 45 59 22 0a 70 68 72 61 73 65 20  ARY KEY".phrase 
1850: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
1860: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 0a 63 61  BLE statement.ca
1870: 75 73 65 73 20 74 68 65 20 63 72 65 61 74 69 6f  uses the creatio
1880: 6e 20 6f 66 20 61 6e 20 5b 75 6e 69 71 75 65 20  n of an [unique 
1890: 69 6e 64 65 78 5d 20 6f 6e 20 74 68 65 20 22 77  index] on the "w
18a0: 6f 72 64 22 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  ord" column.  Th
18b0: 69 73 20 69 6e 64 65 78 20 69 73 20 61 0a 73 65  is index is a.se
18c0: 70 61 72 61 74 65 20 42 2d 54 72 65 65 20 74 68  parate B-Tree th
18d0: 61 74 20 75 73 65 73 20 22 77 6f 72 64 22 20 61  at uses "word" a
18e0: 6e 64 20 74 68 65 20 22 72 6f 77 69 64 22 20 61  nd the "rowid" a
18f0: 73 20 74 68 65 20 6b 65 79 20 61 6e 64 20 73 74  s the key and st
1900: 6f 72 65 73 20 6e 6f 0a 64 61 74 61 20 61 74 20  ores no.data at 
1910: 61 6c 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  all.  Note that 
1920: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
1930: 74 20 6f 66 20 65 76 65 72 79 20 22 77 6f 72 64  t of every "word
1940: 22 20 69 73 20 73 74 6f 72 65 64 20 74 77 69 63  " is stored twic
1950: 65 3a 0a 6f 6e 63 65 20 69 6e 20 74 68 65 20 6d  e:.once in the m
1960: 61 69 6e 20 74 61 62 6c 65 20 61 6e 64 20 61 67  ain table and ag
1970: 61 69 6e 20 69 6e 20 74 68 65 20 69 6e 64 65 78  ain in the index
1980: 2e 0a 0a 3c 70 3e 43 6f 6e 73 69 64 65 72 20 71  ...<p>Consider q
1990: 75 65 72 79 69 6e 67 20 74 68 69 73 20 74 61 62  uerying this tab
19a0: 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  le to find the n
19b0: 75 6d 62 65 72 20 6f 66 20 6f 63 63 75 72 72 65  umber of occurre
19c0: 6e 63 65 73 20 6f 66 20 74 68 65 0a 77 6f 72 64  nces of the.word
19d0: 20 22 78 79 7a 7a 79 22 2e 3a 0a 0a 3c 62 6c 6f   "xyzzy".:..<blo
19e0: 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 53 45  ckquote><pre>.SE
19f0: 4c 45 43 54 20 63 6e 74 20 46 52 4f 4d 20 77 6f  LECT cnt FROM wo
1a00: 72 64 63 6f 75 6e 74 20 57 48 45 52 45 20 77 6f  rdcount WHERE wo
1a10: 72 64 3d 27 78 79 7a 7a 79 27 3b 0a 3c 2f 70 72  rd='xyzzy';.</pr
1a20: 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74 65 3e 0a  e></blockquote>.
1a30: 0a 3c 70 3e 54 68 69 73 20 71 75 65 72 79 20 66  .<p>This query f
1a40: 69 72 73 74 20 68 61 73 20 74 6f 20 73 65 61 72  irst has to sear
1a50: 63 68 20 74 68 65 20 69 6e 64 65 78 20 42 2d 54  ch the index B-T
1a60: 72 65 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ree looking for 
1a70: 61 6e 79 20 65 6e 74 72 79 0a 74 68 61 74 20 63  any entry.that c
1a80: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6d 61 74 63  ontains the matc
1a90: 68 69 6e 67 20 76 61 6c 75 65 20 66 6f 72 20 22  hing value for "
1aa0: 77 6f 72 64 22 2e 20 20 57 68 65 6e 20 61 6e 20  word".  When an 
1ab0: 65 6e 74 72 79 20 69 73 20 66 6f 75 6e 64 20 69  entry is found i
1ac0: 6e 0a 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65  n.the index, the
1ad0: 20 72 6f 77 69 64 20 69 73 20 65 78 74 72 61 63   rowid is extrac
1ae0: 74 65 64 20 61 6e 64 20 75 73 65 64 20 74 6f 20  ted and used to 
1af0: 73 65 61 72 63 68 20 74 68 65 20 6d 61 69 6e 20  search the main 
1b00: 74 61 62 6c 65 2e 0a 54 68 65 6e 20 74 68 65 20  table..Then the 
1b10: 22 63 6e 74 22 20 76 61 6c 75 65 20 69 73 20 72  "cnt" value is r
1b20: 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ead out of the m
1b30: 61 69 6e 20 74 61 62 6c 65 20 61 6e 64 20 72 65  ain table and re
1b40: 74 75 72 6e 65 64 2e 20 20 48 65 6e 63 65 2c 20  turned.  Hence, 
1b50: 74 77 6f 0a 73 65 70 61 72 61 74 65 20 62 69 6e  two.separate bin
1b60: 61 72 79 20 73 65 61 72 63 68 65 73 20 61 72 65  ary searches are
1b70: 20 72 65 71 75 69 72 65 64 20 74 6f 20 66 75 6c   required to ful
1b80: 66 69 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74  fill the request
1b90: 2e 0a 0a 3c 70 3e 41 20 57 49 54 48 4f 55 54 20  ...<p>A WITHOUT 
1ba0: 52 4f 57 49 44 20 74 61 62 6c 65 20 75 73 65 73  ROWID table uses
1bb0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 61 74   a different dat
1bc0: 61 20 64 65 73 69 67 6e 20 66 6f 72 20 74 68 65  a design for the
1bd0: 20 65 71 75 69 76 61 6c 65 6e 74 0a 74 61 62 6c   equivalent.tabl
1be0: 65 2e 0a 0a 3c 62 6c 6f 63 6b 71 75 6f 74 65 3e  e...<blockquote>
1bf0: 3c 70 72 65 3e 0a 43 52 45 41 54 45 20 54 41 42  <pre>.CREATE TAB
1c00: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
1c10: 20 77 6f 72 64 63 6f 75 6e 74 28 0a 20 20 77 6f   wordcount(.  wo
1c20: 72 64 20 54 45 58 54 20 50 52 49 4d 41 52 59 20  rd TEXT PRIMARY 
1c30: 4b 45 59 2c 0a 20 20 63 6e 74 20 49 4e 54 45 47  KEY,.  cnt INTEG
1c40: 45 52 0a 29 20 57 49 54 48 4f 55 54 20 52 4f 57  ER.) WITHOUT ROW
1c50: 49 44 3b 0a 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63  ID;.</pre></bloc
1c60: 6b 71 75 6f 74 65 3e 0a 0a 3c 70 3e 49 6e 20 74  kquote>..<p>In t
1c70: 68 69 73 20 6c 61 74 74 65 72 20 74 61 62 6c 65  his latter table
1c80: 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  , there is only 
1c90: 61 20 73 69 6e 67 6c 65 20 42 2d 54 72 65 65 20  a single B-Tree 
1ca0: 77 68 69 63 68 20 75 73 65 73 20 74 68 65 20 22  which uses the "
1cb0: 77 6f 72 64 22 0a 63 6f 6c 75 6d 6e 20 61 73 20  word".column as 
1cc0: 69 74 73 20 6b 65 79 20 61 6e 64 20 74 68 65 20  its key and the 
1cd0: 22 63 6e 74 22 20 63 6f 6c 75 6d 6e 20 61 73 20  "cnt" column as 
1ce0: 69 74 73 20 64 61 74 61 2e 20 20 28 54 65 63 68  its data.  (Tech
1cf0: 6e 69 63 61 6c 69 74 79 3a 20 20 74 68 65 0a 6c  nicality:  the.l
1d00: 6f 77 2d 6c 65 76 65 6c 20 69 6d 70 6c 65 6d 65  ow-level impleme
1d10: 6e 74 61 74 69 6f 6e 20 61 63 74 75 61 6c 6c 79  ntation actually
1d20: 20 73 74 6f 72 65 73 20 62 6f 74 68 20 22 77 6f   stores both "wo
1d30: 72 64 22 20 61 6e 64 20 22 63 6e 74 22 20 69 6e  rd" and "cnt" in
1d40: 20 74 68 65 20 22 6b 65 79 22 0a 61 72 65 61 20   the "key".area 
1d50: 6f 66 20 74 68 65 20 42 2d 54 72 65 65 2e 20 20  of the B-Tree.  
1d60: 42 75 74 20 75 6e 6c 65 73 73 20 79 6f 75 20 61  But unless you a
1d70: 72 65 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 74 68  re looking at th
1d80: 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 62 79 74 65  e low-level byte
1d90: 20 65 6e 63 6f 64 69 6e 67 0a 6f 66 20 74 68 65   encoding.of the
1da0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1db0: 74 68 61 74 20 66 61 63 74 20 69 73 20 75 6e 69  that fact is uni
1dc0: 6d 70 6f 72 74 61 6e 74 2e 29 20 20 42 65 63 61  mportant.)  Beca
1dd0: 75 73 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  use there is onl
1de0: 79 0a 61 20 73 69 6e 67 6c 65 20 42 2d 54 72 65  y.a single B-Tre
1df0: 65 2c 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  e, the text of t
1e00: 68 65 20 22 77 6f 72 64 22 20 63 6f 6c 75 6d 6e  he "word" column
1e10: 20 69 73 20 6f 6e 6c 79 20 73 74 6f 72 65 64 20   is only stored 
1e20: 6f 6e 63 65 20 69 6e 20 74 68 65 0a 64 61 74 61  once in the.data
1e30: 62 61 73 65 2e 20 20 46 75 72 74 68 65 72 6d 6f  base.  Furthermo
1e40: 72 65 2c 20 71 75 65 72 79 69 6e 67 20 74 68 65  re, querying the
1e50: 20 22 63 6e 74 22 20 76 61 6c 75 65 20 66 6f 72   "cnt" value for
1e60: 20 61 20 73 70 65 63 69 66 69 63 20 22 77 6f 72   a specific "wor
1e70: 64 22 0a 6f 6e 6c 79 20 69 6e 76 6f 6c 76 65 73  d".only involves
1e80: 20 61 20 73 69 6e 67 6c 65 20 62 69 6e 61 72 79   a single binary
1e90: 20 73 65 61 72 63 68 20 69 6e 74 6f 20 74 68 65   search into the
1ea0: 20 6d 61 69 6e 20 42 2d 54 72 65 65 2c 20 73 69   main B-Tree, si
1eb0: 6e 63 65 20 74 68 65 20 22 63 6e 74 22 0a 76 61  nce the "cnt".va
1ec0: 6c 75 65 20 63 61 6e 20 62 65 20 72 65 74 72 69  lue can be retri
1ed0: 65 76 65 64 20 64 69 72 65 63 74 6c 79 20 66 72  eved directly fr
1ee0: 6f 6d 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f  om the record fo
1ef0: 75 6e 64 20 62 79 20 74 68 61 74 20 66 69 72 73  und by that firs
1f00: 74 20 73 65 61 72 63 68 0a 61 6e 64 20 77 69 74  t search.and wit
1f10: 68 6f 75 74 20 74 68 65 20 6e 65 65 64 20 74 6f  hout the need to
1f20: 20 64 6f 20 61 20 73 65 63 6f 6e 64 20 62 69 6e   do a second bin
1f30: 61 72 79 20 73 65 61 72 63 68 20 6f 6e 20 74 68  ary search on th
1f40: 65 20 72 6f 77 69 64 2e 0a 0a 3c 70 3e 54 68 75  e rowid...<p>Thu
1f50: 73 2c 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73  s, in some cases
1f60: 2c 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  , a WITHOUT ROWI
1f70: 44 20 74 61 62 6c 65 20 63 61 6e 20 75 73 65 20  D table can use 
1f80: 61 62 6f 75 74 20 68 61 6c 66 20 74 68 65 20 61  about half the a
1f90: 6d 6f 75 6e 74 0a 6f 66 20 64 69 73 6b 20 73 70  mount.of disk sp
1fa0: 61 63 65 20 61 6e 64 20 63 61 6e 20 6f 70 65 72  ace and can oper
1fb0: 61 74 65 20 6e 65 61 72 6c 79 20 74 77 69 63 65  ate nearly twice
1fc0: 20 61 73 20 66 61 73 74 2e 20 20 4f 66 20 63 6f   as fast.  Of co
1fd0: 75 72 73 65 2c 20 69 6e 20 61 20 0a 72 65 61 6c  urse, in a .real
1fe0: 2d 77 6f 72 6c 64 20 73 63 68 65 6d 61 2c 20 74  -world schema, t
1ff0: 68 65 72 65 20 77 69 6c 6c 20 74 79 70 69 63 61  here will typica
2000: 6c 6c 79 20 62 65 20 73 65 63 6f 6e 64 61 72 79  lly be secondary
2010: 20 69 6e 64 69 63 65 73 20 61 6e 64 2f 6f 72 0a   indices and/or.
2020: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
2030: 74 73 2c 20 61 6e 64 20 74 68 65 20 73 69 74 75  ts, and the situ
2040: 61 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f  ation is more co
2050: 6d 70 6c 69 63 61 74 65 64 2e 20 20 42 75 74 20  mplicated.  But 
2060: 65 76 65 6e 20 74 68 65 6e 2c 0a 74 68 65 72 65  even then,.there
2070: 20 63 61 6e 20 6f 66 74 65 6e 20 62 65 20 73 70   can often be sp
2080: 61 63 65 20 61 6e 64 20 70 65 72 66 6f 72 6d 61  ace and performa
2090: 6e 63 65 20 61 64 76 61 6e 74 61 67 65 73 20 74  nce advantages t
20a0: 6f 20 75 73 69 6e 67 20 57 49 54 48 4f 55 54 20  o using WITHOUT 
20b0: 52 4f 57 49 44 0a 6f 6e 20 74 61 62 6c 65 73 20  ROWID.on tables 
20c0: 74 68 61 74 20 68 61 76 65 20 6e 6f 6e 2d 69 6e  that have non-in
20d0: 74 65 67 65 72 20 6f 72 20 63 6f 6d 70 6f 73 69  teger or composi
20e0: 74 65 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e  te PRIMARY KEYs.
20f0: 0a 0a 3c 68 32 3e 34 2e 30 20 57 68 65 6e 20 54  ..<h2>4.0 When T
2100: 6f 20 55 73 65 20 57 49 54 48 4f 55 54 20 52 4f  o Use WITHOUT RO
2110: 57 49 44 3c 2f 68 32 3e 0a 0a 3c 70 3e 54 68 65  WID</h2>..<p>The
2120: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 6f   WITHOUT ROWID o
2130: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6c  ptimization is l
2140: 69 6b 65 6c 79 20 74 6f 20 62 65 20 68 65 6c 70  ikely to be help
2150: 66 75 6c 20 66 6f 72 20 74 61 62 6c 65 73 0a 74  ful for tables.t
2160: 68 61 74 20 68 61 76 65 20 6e 6f 6e 2d 69 6e 74  hat have non-int
2170: 65 67 65 72 20 6f 72 20 63 6f 6d 70 6f 73 69 74  eger or composit
2180: 65 20 28 6d 75 6c 74 69 2d 63 6f 6c 75 6d 6e 29  e (multi-column)
2190: 20 50 52 49 4d 41 52 59 20 4b 45 59 73 20 61 6e   PRIMARY KEYs an
21a0: 64 20 74 68 61 74 20 64 6f 0a 6e 6f 74 20 73 74  d that do.not st
21b0: 6f 72 65 20 6c 61 72 67 65 20 73 74 72 69 6e 67  ore large string
21c0: 73 20 6f 72 20 42 4c 4f 42 73 2e 3c 2f 70 3e 0a  s or BLOBs.</p>.
21d0: 0a 3c 70 3e 57 49 54 48 4f 55 54 20 52 4f 57 49  .<p>WITHOUT ROWI
21e0: 44 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 77 6f  D tables will wo
21f0: 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 28 74 68  rk correctly (th
2200: 61 74 20 69 73 20 74 6f 20 73 61 79 2c 20 74 68  at is to say, th
2210: 65 79 0a 70 72 6f 76 69 64 65 20 74 68 65 20 63  ey.provide the c
2220: 6f 72 72 65 63 74 20 61 6e 73 77 65 72 29 20 66  orrect answer) f
2230: 6f 72 20 74 61 62 6c 65 73 20 77 69 74 68 20 61  or tables with a
2240: 20 73 69 6e 67 6c 65 20 49 4e 54 45 47 45 52 20   single INTEGER 
2250: 50 52 49 4d 41 52 59 20 4b 45 59 2e 20 0a 48 6f  PRIMARY KEY. .Ho
2260: 77 65 76 65 72 2c 20 6f 72 64 69 6e 61 72 79 20  wever, ordinary 
2270: 72 6f 77 69 64 20 74 61 62 6c 65 73 20 77 69 6c  rowid tables wil
2280: 6c 20 72 75 6e 20 66 61 73 74 65 72 20 69 6e 20  l run faster in 
2290: 74 68 61 74 20 63 61 73 65 2e 20 20 0a 48 65 6e  that case.  .Hen
22a0: 63 65 2c 20 69 74 20 69 73 20 67 6f 6f 64 20 64  ce, it is good d
22b0: 65 73 69 67 6e 0a 74 6f 20 61 76 6f 69 64 20 63  esign.to avoid c
22c0: 72 65 61 74 69 6e 67 20 57 49 54 48 4f 55 54 20  reating WITHOUT 
22d0: 52 4f 57 49 44 20 74 61 62 6c 65 73 20 77 69 74  ROWID tables wit
22e0: 68 20 73 69 6e 67 6c 65 2d 63 6f 6c 75 6d 6e 20  h single-column 
22f0: 50 52 49 4d 41 52 59 20 4b 45 59 73 20 0a 6f 66  PRIMARY KEYs .of
2300: 20 74 79 70 65 20 49 4e 54 45 47 45 52 2e 0a 0a   type INTEGER...
2310: 3c 70 3e 57 49 54 48 4f 55 54 20 52 4f 57 49 44  <p>WITHOUT ROWID
2320: 20 74 61 62 6c 65 73 20 77 6f 72 6b 20 62 65 73   tables work bes
2330: 74 20 77 68 65 6e 20 69 6e 64 69 76 69 64 75 61  t when individua
2340: 6c 20 72 6f 77 73 20 61 72 65 20 6e 6f 74 20 74  l rows are not t
2350: 6f 6f 20 6c 61 72 67 65 2e 0a 41 20 67 6f 6f 64  oo large..A good
2360: 20 72 75 6c 65 2d 6f 66 2d 74 68 75 6d 62 20 69   rule-of-thumb i
2370: 73 20 74 68 61 74 20 74 68 65 20 61 76 65 72 61  s that the avera
2380: 67 65 20 73 69 7a 65 20 6f 66 20 61 20 73 69 6e  ge size of a sin
2390: 67 6c 65 20 72 6f 77 20 69 6e 20 61 0a 57 49 54  gle row in a.WIT
23a0: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
23b0: 20 73 68 6f 75 6c 64 20 62 65 20 6c 65 73 73 20   should be less 
23c0: 74 68 61 6e 20 61 62 6f 75 74 20 31 2f 32 30 74  than about 1/20t
23d0: 68 20 74 68 65 20 73 69 7a 65 20 6f 66 20 0a 61  h the size of .a
23e0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
23f0: 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   That means that
2400: 20 72 6f 77 73 20 73 68 6f 75 6c 64 20 6e 6f 74   rows should not
2410: 20 63 6f 6e 74 61 69 6e 20 6d 6f 72 65 20 74 68   contain more th
2420: 61 6e 20 61 62 6f 75 74 0a 35 30 20 62 79 74 65  an about.50 byte
2430: 73 20 65 61 63 68 20 66 6f 72 20 61 20 31 4b 69  s each for a 1Ki
2440: 42 20 70 61 67 65 20 73 69 7a 65 20 6f 72 20 61  B page size or a
2450: 62 6f 75 74 20 32 30 30 20 62 79 74 65 73 20 65  bout 200 bytes e
2460: 61 63 68 20 66 6f 72 20 34 4b 69 42 0a 70 61 67  ach for 4KiB.pag
2470: 65 20 73 69 7a 65 2e 20 20 57 49 54 48 4f 55 54  e size.  WITHOUT
2480: 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 77 69   ROWID tables wi
2490: 6c 6c 20 77 6f 72 6b 20 28 69 6e 20 74 68 65 20  ll work (in the 
24a0: 73 65 6e 73 65 20 74 68 61 74 0a 74 68 65 79 20  sense that.they 
24b0: 67 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  get the correct 
24c0: 61 6e 73 77 65 72 29 20 66 6f 72 20 61 72 62 69  answer) for arbi
24d0: 74 72 61 72 69 6c 79 20 6c 61 72 67 65 20 72 6f  trarily large ro
24e0: 77 73 20 2d 20 75 70 20 74 6f 20 32 47 42 20 69  ws - up to 2GB i
24f0: 6e 20 73 69 7a 65 20 2d 0a 62 75 74 20 74 72 61  n size -.but tra
2500: 64 69 74 69 6f 6e 61 6c 20 72 6f 77 69 64 20 74  ditional rowid t
2510: 61 62 6c 65 73 20 74 65 6e 64 20 74 6f 20 77 6f  ables tend to wo
2520: 72 6b 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61  rk faster for la
2530: 72 67 65 20 72 6f 77 20 73 69 7a 65 73 2e 0a 54  rge row sizes..T
2540: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 72  his is because r
2550: 6f 77 69 64 20 74 61 62 6c 65 73 20 61 72 65 20  owid tables are 
2560: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 5b  implemented as [
2570: 42 2a 2d 54 72 65 65 73 5d 20 77 68 65 72 65 0a  B*-Trees] where.
2580: 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 73  all content is s
2590: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6c 65 61  tored in the lea
25a0: 76 65 73 20 6f 66 20 74 68 65 20 74 72 65 65 2c  ves of the tree,
25b0: 20 77 68 65 72 65 61 73 20 57 49 54 48 4f 55 54   whereas WITHOUT
25c0: 20 52 4f 57 49 44 20 0a 74 61 62 6c 65 73 20 61   ROWID .tables a
25d0: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  re implemented u
25e0: 73 69 6e 67 20 6f 72 64 69 6e 61 72 79 20 42 2d  sing ordinary B-
25f0: 54 72 65 65 73 20 77 69 74 68 20 63 6f 6e 74 65  Trees with conte
2600: 6e 74 20 73 74 6f 72 65 64 20 6f 6e 20 62 6f 74  nt stored on bot
2610: 68 0a 6c 65 61 76 65 73 20 61 6e 64 20 69 6e 74  h.leaves and int
2620: 65 72 6d 65 64 69 61 74 65 20 6e 6f 64 65 73 2e  ermediate nodes.
2630: 20 20 53 74 6f 72 69 6e 67 20 63 6f 6e 74 65 6e    Storing conten
2640: 74 20 69 6e 20 0a 69 6e 74 65 72 6d 65 64 69 61  t in .intermedia
2650: 74 65 20 6e 6f 64 65 73 20 6d 65 61 6e 20 74 68  te nodes mean th
2660: 61 74 20 65 61 63 68 20 69 6e 74 65 72 6d 65 64  at each intermed
2670: 69 61 74 65 20 6e 6f 64 65 20 65 6e 74 72 79 20  iate node entry 
2680: 74 61 6b 65 73 20 75 70 20 6d 6f 72 65 0a 73 70  takes up more.sp
2690: 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
26a0: 61 6e 64 20 74 68 75 73 20 72 65 64 75 63 65 73  and thus reduces
26b0: 20 74 68 65 20 66 61 6e 2d 6f 75 74 2c 20 69 6e   the fan-out, in
26c0: 63 72 65 61 73 69 6e 67 20 74 68 65 20 73 65 61  creasing the sea
26d0: 72 63 68 20 63 6f 73 74 2e 0a 0a 3c 70 3e 54 68  rch cost...<p>Th
26e0: 65 20 22 73 71 6c 69 74 65 33 5f 61 6e 61 6c 79  e "sqlite3_analy
26f0: 7a 65 72 2e 65 78 65 22 20 75 74 69 6c 69 74 79  zer.exe" utility
2700: 20 70 72 6f 67 72 61 6d 2c 20 61 76 61 69 6c 61   program, availa
2710: 62 6c 65 20 61 73 20 73 6f 75 72 63 65 20 63 6f  ble as source co
2720: 64 65 0a 69 6e 20 74 68 65 20 53 51 4c 69 74 65  de.in the SQLite
2730: 20 73 6f 75 72 63 65 20 74 72 65 65 20 6f 72 20   source tree or 
2740: 61 73 20 61 20 70 72 65 63 6f 6d 70 69 6c 65 64  as a precompiled
2750: 20 62 69 6e 61 72 79 20 6f 6e 20 74 68 65 0a 5b   binary on the.[
2760: 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69 74  http://www.sqlit
2770: 65 2e 6f 72 67 2f 64 6f 77 6e 6c 6f 61 64 2e 68  e.org/download.h
2780: 74 6d 6c 20 7c 20 53 51 4c 69 74 65 20 44 6f 77  tml | SQLite Dow
2790: 6e 6c 6f 61 64 20 70 61 67 65 5d 2c 20 63 61 6e  nload page], can
27a0: 20 62 65 0a 75 73 65 64 20 74 6f 20 6d 65 61 73   be.used to meas
27b0: 75 72 65 20 74 68 65 20 61 76 65 72 61 67 65 20  ure the average 
27c0: 73 69 7a 65 73 20 6f 66 20 74 61 62 6c 65 20 72  sizes of table r
27d0: 6f 77 73 20 69 6e 20 61 6e 20 65 78 69 73 74 69  ows in an existi
27e0: 6e 67 20 53 51 4c 69 74 65 0a 64 61 74 61 62 61  ng SQLite.databa
27f0: 73 65 2e 3c 2f 70 3e 0a 0a 3c 70 3e 4e 6f 74 65  se.</p>..<p>Note
2800: 20 74 68 61 74 20 65 78 63 65 70 74 20 66 6f 72   that except for
2810: 20 61 20 66 65 77 20 63 6f 72 6e 65 72 2d 63 61   a few corner-ca
2820: 73 65 20 64 69 66 66 65 72 65 6e 63 65 73 20 64  se differences d
2830: 65 74 61 69 6c 65 64 20 61 62 6f 76 65 2c 0a 57  etailed above,.W
2840: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
2850: 6c 65 73 20 61 6e 64 20 72 6f 77 69 64 20 74 61  les and rowid ta
2860: 62 6c 65 73 20 77 6f 72 6b 20 74 68 65 20 73 61  bles work the sa
2870: 6d 65 2e 20 20 54 68 65 79 20 62 6f 74 68 20 67  me.  They both g
2880: 65 6e 65 72 61 74 65 0a 74 68 65 20 73 61 6d 65  enerate.the same
2890: 20 61 6e 73 77 65 72 73 20 67 69 76 65 6e 20 74   answers given t
28a0: 68 65 20 73 61 6d 65 20 53 51 4c 20 73 74 61 74  he same SQL stat
28b0: 65 6d 65 6e 74 73 2e 20 20 53 6f 20 69 74 20 69  ements.  So it i
28c0: 73 20 61 20 73 69 6d 70 6c 65 20 6d 61 74 74 65  s a simple matte
28d0: 72 0a 74 6f 20 72 75 6e 20 65 78 70 65 72 69 6d  r.to run experim
28e0: 65 6e 74 73 20 6f 6e 20 61 6e 20 61 70 70 6c 69  ents on an appli
28f0: 63 61 74 69 6f 6e 2c 20 6c 61 74 65 20 69 6e 20  cation, late in 
2900: 74 68 65 20 64 65 76 65 6c 6f 70 6d 65 6e 74 20  the development 
2910: 63 79 63 6c 65 2c 0a 74 6f 20 74 65 73 74 20 77  cycle,.to test w
2920: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
2930: 65 20 75 73 65 20 6f 66 20 57 49 54 48 4f 55 54  e use of WITHOUT
2940: 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 77 69   ROWID tables wi
2950: 6c 6c 20 62 65 20 68 65 6c 70 66 75 6c 2e 0a 41  ll be helpful..A
2960: 20 67 6f 6f 64 20 73 74 72 61 74 65 67 79 20 69   good strategy i
2970: 73 20 74 6f 20 73 69 6d 70 6c 79 20 6e 6f 74 20  s to simply not 
2980: 77 6f 72 72 79 20 61 62 6f 75 74 20 57 49 54 48  worry about WITH
2990: 4f 55 54 20 52 4f 57 49 44 20 75 6e 74 69 6c 20  OUT ROWID until 
29a0: 6e 65 61 72 0a 74 68 65 20 65 6e 64 20 6f 66 20  near.the end of 
29b0: 70 72 6f 64 75 63 74 20 64 65 76 65 6c 6f 70 6d  product developm
29c0: 65 6e 74 2c 20 74 68 65 6e 20 67 6f 20 62 61 63  ent, then go bac
29d0: 6b 20 61 6e 64 20 72 75 6e 20 74 65 73 74 73 20  k and run tests 
29e0: 74 6f 20 73 65 65 0a 69 66 20 61 64 64 69 6e 67  to see.if adding
29f0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
2a00: 6f 20 74 61 62 6c 65 73 20 77 69 74 68 20 6e 6f  o tables with no
2a10: 6e 2d 69 6e 74 65 67 65 72 20 50 52 49 4d 41 52  n-integer PRIMAR
2a20: 59 20 4b 45 59 73 20 68 65 6c 70 73 0a 6f 72 20  Y KEYs helps.or 
2a30: 68 75 72 74 73 20 70 65 72 66 6f 72 6d 61 6e 63  hurts performanc
2a40: 65 2c 20 61 6e 64 20 72 65 74 61 69 6e 69 6e 67  e, and retaining
2a50: 20 74 68 65 20 57 49 54 48 4f 55 54 20 52 4f 57   the WITHOUT ROW
2a60: 49 44 20 6f 6e 6c 79 20 69 6e 20 74 68 6f 73 65  ID only in those
2a70: 20 63 61 73 65 73 0a 77 68 65 72 65 20 69 74 20   cases.where it 
2a80: 68 65 6c 70 73 2e 0a                             helps..