]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Take steps to avoid misestimating range query costs based on STAT4 data
authordrh <drh@noemail.net>
Wed, 22 Oct 2014 15:27:05 +0000 (15:27 +0000)
committerdrh <drh@noemail.net>
Wed, 22 Oct 2014 15:27:05 +0000 (15:27 +0000)
due to the roundoff error of converting from integers to LogEst and back
to integers.

FossilOrigin-Name: 3c933bf95f291f7957580d823dce92c981375a5c

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

index f4a8a2a556ff1695ade75366e855fc7c8d35c28c..8290b14522c03337edcb710d20a41fc6e64fde8f 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Call\sfsync()\sright\safter\sftruncate()\swhen\sin\sjournal_mode=TRUNCATE\sand\nwhen\ssynchronous=FULL\sin\sorder\sto\sensure\sthat\stransactions\sare\sdurable\nacross\sa\spower\sloss\sthat\shappens\smoments\safter\sthe\scommit.\s\sProposed\nfix\sfor\s[https://bugzilla.mozilla.org/show_bug.cgi?id=1072773].
-D 2014-10-21T21:56:06.890
+C Take\ssteps\sto\savoid\smisestimating\srange\squery\scosts\sbased\son\sSTAT4\sdata\ndue\sto\sthe\sroundoff\serror\sof\sconverting\sfrom\sintegers\sto\sLogEst\sand\sback\nto\sintegers.
+D 2014-10-22T15:27:05.734
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in cf57f673d77606ab0f2d9627ca52a9ba1464146a
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -166,7 +166,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
 F sqlite3.1 3d8b83c91651f53472ca17599dae3457b8b89494
 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
 F src/alter.c ba266a779bc7ce10e52e59e7d3dc79fa342e8fdb
-F src/analyze.c 8c322e1ecc08909526dbd5ab4421889d05f2263d
+F src/analyze.c 567c94b763b67f7abda06dbf0ba34b0343ed9447
 F src/attach.c f4e94df2d1826feda65eb0939f7f6f5f923a0ad9
 F src/auth.c d8abcde53426275dab6243b441256fcd8ccbebb2
 F src/backup.c a31809c65623cc41849b94d368917f8bb66e6a7e
@@ -232,7 +232,7 @@ F src/shell.c 282f8f5278e0c78eb442217531172ec9e1538796
 F src/sqlite.h.in 4a5e5158c189d2bcd45c7c4607c2c0eb6d25c153
 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad
 F src/sqlite3ext.h 17d487c3c91b0b8c584a32fbeb393f6f795eea7d
-F src/sqliteInt.h f7812f74f2d0c6041ef6b91a99c5a45f775dd408
+F src/sqliteInt.h d6d423b0f62846eb441236bc15417aeede2ebbdc
 F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
 F src/status.c 961d5926e5a8fda611d385ec22c226b8635cd1cb
 F src/table.c 2e99ef7ef16187e17033d9398dc962ce22dab5cb
@@ -302,7 +302,7 @@ F src/vtab.c cb0c194303fea276b48d7d4b6d970b5a96bde8de
 F src/wal.c 10e7de7ce90865a68153f001a61f1d985cd17983
 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4
 F src/walker.c c253b95b4ee44b21c406e2a1052636c31ea27804
-F src/where.c 994b38c8697aad095878ef1e4860902df457427f
+F src/where.c 5099c42e24c63969b3cf3b52e18c1a36cb841a34
 F src/whereInt.h 4b459cdbfc9b01f5f27673a35f9967e4dea917e8
 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
@@ -1205,7 +1205,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P a27861c28c4791e51d797aa37e9cca806cb58775
-R 1375151e695773da263f40095fae22af
+P 3e922208b68563489c7766abb9afb4885113e7b8
+R 5c508733aebac553de79291a7eabd709
 U drh
-Z be5219411fed69e2fe0e0626925bcd5e
+Z a3d7104c7f173585d7e788d6453aa065
index db15d6664e67000868e79e399c54a48f55ab07f0..b84af28cee10485acfaa2deeceb1c6d5ed405ad0 100644 (file)
@@ -1 +1 @@
-3e922208b68563489c7766abb9afb4885113e7b8
\ No newline at end of file
+3c933bf95f291f7957580d823dce92c981375a5c
\ No newline at end of file
index 7d36f013189bfee7b3fb55d78fb88afe629a1918..67bba1a28aa7847e224a377133c64c448b134611 100644 (file)
@@ -1599,6 +1599,7 @@ static void initAvgEq(Index *pIdx){
         nRow = pIdx->aiRowEst[0];
         nDist100 = ((i64)100 * pIdx->aiRowEst[0]) / pIdx->aiRowEst[iCol+1];
       }
+      pIdx->nRowEst0 = nRow;
 
       /* Set nSum to the number of distinct (iCol+1) field prefixes that
       ** occur in the stat4 table for this index. Set sumEq to the sum of 
index cba89b03e77332bc60bd6999485b8a1454354001..5409f7086f8e69a87e65f8348cbf2af5497ed7e5 100644 (file)
@@ -1801,7 +1801,8 @@ struct Index {
   int nSampleCol;          /* Size of IndexSample.anEq[] and so on */
   tRowcnt *aAvgEq;         /* Average nEq values for keys not in aSample */
   IndexSample *aSample;    /* Samples of the left-most key */
-  tRowcnt *aiRowEst;       /* Non-logarithmic stat1 data for this table */
+  tRowcnt *aiRowEst;       /* Non-logarithmic stat1 data for this index */
+  tRowcnt nRowEst0;        /* Non-logarithmic number of rows in the index */
 #endif
 };
 
index 7f51d00c87091db0456ff10bb3145336494b45ed..f708d7fad7d38a9b1e632d67313ec5d4a3c4f8eb 100644 (file)
@@ -2198,7 +2198,7 @@ static int whereRangeScanEst(
       /* Determine iLower and iUpper using ($P) only. */
       if( nEq==0 ){
         iLower = 0;
-        iUpper = sqlite3LogEstToInt(p->aiRowLogEst[0]);
+        iUpper = p->nRowEst0;
       }else{
         /* Note: this call could be optimized away - since the same values must 
         ** have been requested when testing key $P in whereEqualScanEst().  */