-C Ensure\sthat\sall\selements\sof\saiRowLogEst[]\shave\sbeen\sinitialized\seven\sif\nthe\sstat\sentry\sis\struncated.
-D 2023-12-31T12:38:43.242
+C Better\scomments.\s\sSlight\stuning\sof\sparameters.
+D 2023-12-31T20:04:32.564
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
F sqlite_cfg.h.in baf2e409c63d4e7a765e17769b6ff17c5a82bbd9cbf1e284fd2e4cefaff3fcf2
F src/alter.c 30c2333b8bb3af71e4eb9adeadee8aa20edb15917ed44b8422e5cd15f3dfcddc
-F src/analyze.c ac9f1c4c1b84290a4020c9a997472ed547fb69a6a7842b2c08f3e812350afe1b
+F src/analyze.c 47711a594b1e9784164d32715725f01bdb9fed52fd6cfaa2432730e8c3c2b746
F src/attach.c cc9d00d30da916ff656038211410ccf04ed784b7564639b9b61d1839ed69fd39
F src/auth.c 19b7ccacae3dfba23fc6f1d0af68134fa216e9040e53b0681b4715445ea030b4
F src/backup.c 5c97e8023aab1ce14a42387eb3ae00ba5a0644569e3476f38661fa6f824c3523
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 41773fa760f10964b3f276a9a45f7e32df0082b516edc76d70609e7eb5f81b14
-R 86aadf86c2aebf26ba64c00e21b31fa8
+P c216921b115169ebfd239267b4ab5ad0fc960ffadce09044b68812f49110d607
+R df3f6be38a64508c745873953ba288dd
U drh
-Z 5b1f740a8f3b3d58901009fd961c1842
+Z 151bd3600feff84e5eb2b344bddccb6f
# Remove this line to create a well-formed Fossil manifest.
** estimated number of rows in the index. */
iVal = p->nEst;
}else if( iVal<mx/10 ){
- /* Report uneven= if the maximum run of identical values ever
- ** reaches or exceeds 10 times the average run */
+ /* ^^-- TUNING: threshold for when uneven=NNN is reported
+ ** tag-20231231-01: Report uneven= if the maximum run of identical
+ ** values ever reaches or exceeds 10 (or so) times the average run.
+ ** The reporting threshold of 10 is tunable, but if changed, one
+ ** should also consider changing the aiRowLogEst adjustment factor at
+ ** tag-20231231-02.
+ */
int iRatio = mx/iVal;
if( iUneven<iRatio ) iUneven = iRatio;
}else if( iVal==2 && p->nRow*10 <= nDistinct*11 ){
/* Add the "slow" argument if the peak number of rows obtained
** from a full equality match is so large that a full table scan
- ** seems likely to be faster.
+ ** seems likely to be faster than using the index. The query planner
+ ** will use the "slow" argument as a hint to avoid using this index
+ ** for equality lookups.
+ **
+ ** We let ANALYZE determine "slow" rather than the query planner for
+ ** two reasons: (1) It leaves a visible trace in the sqlite_stat1 table
+ ** that an index is not useful, and hence serves as a hint to the
+ ** application developers that the index is a good candidate to be
+ ** dropped. (2) Being able to use UPDATE to control the presence or
+ ** absence of the "slow" argument in sqlite_stat1 enables greater
+ ** control over the query planner during testing.
*/
if( i==p->nKeyCol-1
- && nRow > 1000
- && nRow <= iVal*iUneven + sqlite3LogEst(nRow*2/3)
+ && nRow > 1000 && nRow <= iVal*iUneven + sqlite3LogEst(nRow) - 6
+ /* ^^^^------------- TUNING ----------------------------^ */
){
sqlite3_str_appendf(&sStat, " slow");
}
pIndex->bUnordered = 0;
pIndex->noSkipScan = 0;
pIndex->bSlow = 0;
+ assert( aLog!=0 );
while( z[0] ){
if( sqlite3_strglob("unordered*", z)==0 ){
pIndex->bUnordered = 1;
/* An argument of "uneven=NNN" means that the maximum length
** run of the same value is NNN times longer than the average.
** Go through the iaRowLogEst[] values for the index and increase
- ** them so that so that they are each no less than 1/8th the
- ** maximum value. */
- LogEst scale = sqlite3LogEst(sqlite3Atoi(z+7)) - 30;
+ ** them by 0.1*NNN, so that so that they are each about 1/10th of
+ ** of the maximum value.
+ **
+ ** The stat column continues to hold the average run length, and
+ ** then the average is adjusted by the uneven=NNN value. We do this
+ ** instead of adjusting the run length values in the main body of
+ ** the stat column for backwards compatibility to older versions of
+ ** SQLite that expect values in state to be the true the average.
+ ** Also because the file format specifies that the values in the main
+ ** body of the stat column should be the true average.
+ **
+ ** tag-20231231-02: The 1/10th threshold is tunable. But if changed,
+ ** one should make a similar adjustment to the uneven=NNN threashold
+ ** at tag-20231231-01: TUNING ----vv */
+ LogEst scale = sqlite3LogEst(sqlite3Atoi(z+7)) - 33;
+ assert( sqlite3LogEst(10)==33 );
if( scale>0 ){
LogEst mx = aLog[0];
int jj;