]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Experimental branch allowing different postulated scan rates for each index.
authordrh <drh@noemail.net>
Thu, 3 Oct 2013 19:21:41 +0000 (19:21 +0000)
committerdrh <drh@noemail.net>
Thu, 3 Oct 2013 19:21:41 +0000 (19:21 +0000)
FossilOrigin-Name: d59d97b0a8d70dc31d45db61bbc11ebb5375a224

manifest
manifest.uuid
src/analyze.c
src/build.c
src/sqliteInt.h

index bb29bafc5abc4aa19d599e948d1eecfdda306647..c1cf71301ae36e166a83cd615c85ce3553b6922e 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C The\ssqlite3FixInit()\sroutine\scannot\sfail.\s\sSo\schange\sthe\sreturn\stype\sfrom\s"int"\nto\s"void".
-D 2013-10-03T15:39:44.505
+C Experimental\sbranch\sallowing\sdifferent\spostulated\sscan\srates\sfor\seach\sindex.
+D 2013-10-03T19:21:41.923
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 5e41da95d92656a5004b03d3576e8b226858a28e
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -157,7 +157,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
 F sqlite3.1 6be1ad09113570e1fc8dcaff84c9b0b337db5ffc
 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
 F src/alter.c 2af0330bb1b601af7a7789bf7229675fd772a083
-F src/analyze.c d322972af09e3f8debb45f420dfe3ded142b108b
+F src/analyze.c 41caf5d01c2aefe442a52dbceff81095260e4c78
 F src/attach.c 0a17c9364895316ca4f52d06a97a72c0af1ae8b3
 F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34
 F src/backup.c 2f1987981139bd2f6d8c728d64bf09fb387443c3
@@ -166,7 +166,7 @@ F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7
 F src/btree.c 5ccbbaed7a32ba774306f610da4ab4f3e5348294
 F src/btree.h bfe0e8c5759b4ec77b0d18390064a6ef3cdffaaf
 F src/btreeInt.h f038e818bfadf75afbd09819ed93c26a333d39e0
-F src/build.c 834fa4bb0fa936c39336c52f5aacc659035d973e
+F src/build.c 7926e17a5dc3f698dd8b15511a4902f48c73ac50
 F src/callback.c f99a8957ba2adf369645fac0db09ad8adcf1caa2
 F src/complete.c dc1d136c0feee03c2f7550bafc0d29075e36deac
 F src/ctime.c ea4b7f3623a0fcb1146e7f245d7410033e86859c
@@ -221,7 +221,7 @@ F src/shell.c 5ee50ca3e35453bbd6ccdf1bdd0f6bbe9738e9fb
 F src/sqlite.h.in ec40aa958a270416fb04b4f72210357bf163d2c5
 F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e
 F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc
-F src/sqliteInt.h 50f51427e7afd2803c9b8380d34069ae212a0f4c
+F src/sqliteInt.h c32d524facfb39084cc1a830aef0c31aeb93c04e
 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
 F src/status.c 7ac05a5c7017d0b9f0b4bcd701228b784f987158
 F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e
@@ -1119,7 +1119,10 @@ F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
 F tool/wherecosttest.c f407dc4c79786982a475261866a161cd007947ae
 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
-P 8338232a111be16d6c2ab57176d0a23a001f02ad
-R b1cce97e822326c63df11398c4318c43
+P 500c5932fe3f5fcd0940522f7839d581c555e0eb
+R c43f0933dc867b5f8554e92f9664b3d0
+T *branch * index-scan-rate
+T *sym-index-scan-rate *
+T -sym-trunk *
 U drh
-Z da47fe5fd9aed60cdbc3a07080f59327
+Z ac91788b1f42a4c56b173a94be0ebf5a
index f60b01037b7eb959251cb98c7ccb6dae532454d1..7697e0083f4d5625dec66f29d2bc3dd31da4c125 100644 (file)
@@ -1 +1 @@
-500c5932fe3f5fcd0940522f7839d581c555e0eb
\ No newline at end of file
+d59d97b0a8d70dc31d45db61bbc11ebb5375a224
\ No newline at end of file
index 474d80d1b87ee3d069e7258ca1be6691fc9e900e..83c0950249bde5e35403e4621522bdbcc73ef7cb 100644 (file)
@@ -1250,17 +1250,16 @@ struct analysisInfo {
 ** the array aOut[].
 */
 static void decodeIntArray(
-  char *zIntArray, 
-  int nOut, 
-  tRowcnt *aOut, 
-  int *pbUnordered
+  char *zIntArray,       /* String containing int array to decode */
+  int nOut,              /* Number of slots in aOut[] */
+  tRowcnt *aOut,         /* Store integers here */
+  Index *pIndex          /* Handle extra flags for this index, if not NULL */
 ){
   char *z = zIntArray;
   int c;
   int i;
   tRowcnt v;
-
-  assert( pbUnordered==0 || *pbUnordered==0 );
+  int v32;
 
 #ifdef SQLITE_ENABLE_STAT3_OR_STAT4
   if( z==0 ) z = "";
@@ -1276,8 +1275,20 @@ static void decodeIntArray(
     aOut[i] = v;
     if( *z==' ' ) z++;
   }
-  if( pbUnordered && strcmp(z, "unordered")==0 ){
-    *pbUnordered = 1;
+  if( pIndex ){
+    while( z[0] ){
+      for(i=1; z[i] && z[i]!=' '; i++){}
+      if( i==9 && memcmp(z, "unordered", 9)==0 ){
+        pIndex->bUnordered = 1;
+      }else if( i>2 && memcmp(z, "r=", 2)==0
+                && sqlite3GetInt32(z+2, &v32) ){
+        if( v32>255 ) v32 = 255;
+        if( v32<0 ) v32 = 0;
+        pIndex->iScanRatio = (u8)v32;
+      }
+      z += i;
+      if( z[0]==' ' ) z++;
+    }
   }
 }
 
@@ -1316,10 +1327,8 @@ static int analysisLoader(void *pData, int argc, char **argv, char **NotUsed){
   z = argv[2];
 
   if( pIndex ){
-    int bUnordered = 0;
-    decodeIntArray((char*)z, pIndex->nColumn+1, pIndex->aiRowEst,&bUnordered);
+    decodeIntArray((char*)z, pIndex->nColumn+1, pIndex->aiRowEst, pIndex);
     if( pIndex->pPartIdxWhere==0 ) pTable->nRowEst = pIndex->aiRowEst[0];
-    pIndex->bUnordered = bUnordered;
   }else{
     decodeIntArray((char*)z, 1, &pTable->nRowEst, 0);
   }
index 79753f093fc6f3d6c64393db45d0498a6f569f21..83ce948dc116c6847519d5dd022bbdd47586678f 100644 (file)
@@ -2442,6 +2442,15 @@ static void sqlite3RefillIndex(Parse *pParse, Index *pIndex, int memRootPage){
   sqlite3VdbeAddOp1(v, OP_Close, iSorter);
 }
 
+/*
+** Estimate the average width of a table column based on its affinity type.
+*/
+static unsigned estimatedColumnWidth(const Column *p){
+  if( p->affinity>=SQLITE_AFF_NUMERIC ) return 1;
+  if( p->affinity==SQLITE_AFF_TEXT ) return 3;
+  return 2;
+}
+
 /*
 ** Create a new index for an SQL table.  pName1.pName2 is the name of the index 
 ** and pTblList is the name of the table that is to be indexed.  Both will 
@@ -2484,9 +2493,12 @@ Index *sqlite3CreateIndex(
   int iDb;             /* Index of the database that is being written */
   Token *pName = 0;    /* Unqualified name of the index to create */
   struct ExprList_item *pListItem; /* For looping over pList */
-  int nCol;
-  int nExtra = 0;
-  char *zExtra;
+  unsigned wTable = 0;             /* Approximate "width" of the table */
+  unsigned wIndex = 0;             /* Approximate "width" of this index */
+  const Column *pTabCol;           /* A column in the table */
+  int nCol;                        /* Number of columns */
+  int nExtra = 0;                  /* Space allocated for zExtra[] */
+  char *zExtra;                    /* Extra space after the Index object */
 
   assert( pParse->nErr==0 );      /* Never called with prior errors */
   if( db->mallocFailed || IN_DECLARE_VTAB ){
@@ -2713,7 +2725,6 @@ Index *sqlite3CreateIndex(
   */
   for(i=0, pListItem=pList->a; i<pList->nExpr; i++, pListItem++){
     const char *zColName = pListItem->zName;
-    Column *pTabCol;
     int requestedSortOrder;
     char *zColl;                   /* Collation sequence name */
 
@@ -2727,6 +2738,7 @@ Index *sqlite3CreateIndex(
       goto exit_create_index;
     }
     pIndex->aiColumn[i] = j;
+    wIndex += estimatedColumnWidth(pTabCol);
     if( pListItem->pExpr ){
       int nColl;
       assert( pListItem->pExpr->op==TK_COLLATE );
@@ -2750,6 +2762,11 @@ Index *sqlite3CreateIndex(
     if( pTab->aCol[j].notNull==0 ) pIndex->uniqNotNull = 0;
   }
   sqlite3DefaultRowEst(pIndex);
+  for(j=pTab->nCol, pTabCol=pTab->aCol; j>0; j--, pTabCol++){
+    wTable += estimatedColumnWidth(pTabCol);
+  }
+  assert( 100*wIndex/wTable <= 255 );
+  pIndex->iScanRatio = (u8)(128*wIndex/wTable);
 
   if( pTab==pParse->pNewTable ){
     /* This routine has been called to create an automatic index as a
index 4fa7332035eaa6670d89d1c3643574ba8dac55cc..2fb5c4063997b01868e6303950af4606eec04663 100644 (file)
@@ -1472,7 +1472,7 @@ struct FKey {
 #define OE_SetDflt  8   /* Set the foreign key value to its default */
 #define OE_Cascade  9   /* Cascade the changes */
 
-#define OE_Default  99  /* Do whatever the default action is */
+#define OE_Default  10  /* Do whatever the default action is */
 
 
 /*
@@ -1560,7 +1560,8 @@ struct Index {
   Expr *pPartIdxWhere;     /* WHERE clause for partial indices */
   int tnum;                /* DB Page containing root of this index */
   u16 nColumn;             /* Number of columns in table used by this index */
-  u8 onError;              /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */
+  u8 iScanRatio;           /* Scan rate relative to the main table */
+  unsigned onError:4;      /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */
   unsigned autoIndex:2;    /* 1==UNIQUE, 2==PRIMARY KEY, 0==CREATE INDEX */
   unsigned bUnordered:1;   /* Use this index for == or IN queries only */
   unsigned uniqNotNull:1;  /* True if UNIQUE and NOT NULL for all columns */