1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-10 01:02:56 +03:00

Improve the accuracy of the estimates used when searching an index for values not present in any stat4 samples under some circumstances.

FossilOrigin-Name: e6f7f97dbc677c9f01b23142928c3fa7307c2fba
This commit is contained in:
dan
2014-10-03 19:16:53 +00:00
parent 79f7af9a9e
commit 43085d7425
4 changed files with 53 additions and 23 deletions

View File

@@ -1,5 +1,5 @@
C Add\srequirements\smarks\son\sthe\ssqlite3_db_status()\sinterface\simplementation.\nFix\sa\stypo\sin\sthe\sdocumentation.\s\sFix\sthe\snew\ssqlite3_result_text64()\sroutine\nso\sthat\sit\sworks\scorrectly\swith\san\sencoding\sparameter\sof\sSQLITE_UTF16. C Improve\sthe\saccuracy\sof\sthe\sestimates\sused\swhen\ssearching\san\sindex\sfor\svalues\snot\spresent\sin\sany\sstat4\ssamples\sunder\ssome\scircumstances.
D 2014-10-03T16:00:51.115 D 2014-10-03T19:16:53.018
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in cf57f673d77606ab0f2d9627ca52a9ba1464146a F Makefile.in cf57f673d77606ab0f2d9627ca52a9ba1464146a
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -166,7 +166,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
F sqlite3.1 3d8b83c91651f53472ca17599dae3457b8b89494 F sqlite3.1 3d8b83c91651f53472ca17599dae3457b8b89494
F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
F src/alter.c ba266a779bc7ce10e52e59e7d3dc79fa342e8fdb F src/alter.c ba266a779bc7ce10e52e59e7d3dc79fa342e8fdb
F src/analyze.c 6290a109be876daaa242cd7216f97240f5401776 F src/analyze.c 418c2fc20cd36f1acc82456b5bd9baae77dbda78
F src/attach.c f4e94df2d1826feda65eb0939f7f6f5f923a0ad9 F src/attach.c f4e94df2d1826feda65eb0939f7f6f5f923a0ad9
F src/auth.c d8abcde53426275dab6243b441256fcd8ccbebb2 F src/auth.c d8abcde53426275dab6243b441256fcd8ccbebb2
F src/backup.c a31809c65623cc41849b94d368917f8bb66e6a7e F src/backup.c a31809c65623cc41849b94d368917f8bb66e6a7e
@@ -232,7 +232,7 @@ F src/shell.c 38f627b0885191357f55902a3ac199de90d79715
F src/sqlite.h.in a0b09ea5f73f3629c20b9788e0cde2a70f1703f5 F src/sqlite.h.in a0b09ea5f73f3629c20b9788e0cde2a70f1703f5
F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad
F src/sqlite3ext.h 17d487c3c91b0b8c584a32fbeb393f6f795eea7d F src/sqlite3ext.h 17d487c3c91b0b8c584a32fbeb393f6f795eea7d
F src/sqliteInt.h 5a430c5443717d7c5e2c224f9dcc2534348dc3f6 F src/sqliteInt.h 3e4bd1b2288528b6a7f2d52709618572b422ab7e
F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d F src/sqliteLimit.h 164b0e6749d31e0daa1a4589a169d31c0dec7b3d
F src/status.c 961d5926e5a8fda611d385ec22c226b8635cd1cb F src/status.c 961d5926e5a8fda611d385ec22c226b8635cd1cb
F src/table.c 2e99ef7ef16187e17033d9398dc962ce22dab5cb F src/table.c 2e99ef7ef16187e17033d9398dc962ce22dab5cb
@@ -1201,7 +1201,10 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32 F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
P 440705b98a3429b830ea85e71cc1e414bc6d8058 P d2fc322728331ae2d147c8496129df5e3c655eb5
R 8a35df4f3d17b4f437ae0dc791626bd3 R 57c99795ca217ceed92eda9a33e89730
U drh T *branch * stat4-avgeq
Z 3c9270c816943439d7ab9b669a742153 T *sym-stat4-avgeq *
T -sym-trunk *
U dan
Z 343ac493fd77cb5d6f7bcecf2a2a97e2

View File

@@ -1 +1 @@
d2fc322728331ae2d147c8496129df5e3c655eb5 e6f7f97dbc677c9f01b23142928c3fa7307c2fba

View File

@@ -1448,12 +1448,12 @@ static void decodeIntArray(
#ifdef SQLITE_ENABLE_STAT3_OR_STAT4 #ifdef SQLITE_ENABLE_STAT3_OR_STAT4
if( aOut ){ if( aOut ){
aOut[i] = v; aOut[i] = v;
}else }
#else #else
assert( aOut==0 ); assert( aOut==0 );
UNUSED_PARAMETER(aOut); UNUSED_PARAMETER(aOut);
#endif #endif
{ if( aLog ){
aLog[i] = sqlite3LogEst(v); aLog[i] = sqlite3LogEst(v);
} }
if( *z==' ' ) z++; if( *z==' ' ) z++;
@@ -1516,8 +1516,16 @@ static int analysisLoader(void *pData, int argc, char **argv, char **NotUsed){
z = argv[2]; z = argv[2];
if( pIndex ){ if( pIndex ){
int nCol = pIndex->nKeyCol+1;
#ifdef SQLITE_ENABLE_STAT3_OR_STAT4
tRowcnt * const aiRowEst = pIndex->aiRowEst = (tRowcnt*)sqlite3DbMallocZero(
pInfo->db, sizeof(tRowcnt) * nCol
);
#else
tRowcnt * const aiRowEst = 0;
#endif
pIndex->bUnordered = 0; pIndex->bUnordered = 0;
decodeIntArray((char*)z, pIndex->nKeyCol+1, 0, pIndex->aiRowLogEst, pIndex); decodeIntArray((char*)z, nCol, aiRowEst, pIndex->aiRowLogEst, pIndex);
if( pIndex->pPartIdxWhere==0 ) pTable->nRowLogEst = pIndex->aiRowLogEst[0]; if( pIndex->pPartIdxWhere==0 ) pTable->nRowLogEst = pIndex->aiRowLogEst[0];
}else{ }else{
Index fakeIdx; Index fakeIdx;
@@ -1576,25 +1584,38 @@ static void initAvgEq(Index *pIdx){
pIdx->aAvgEq[nCol] = 1; pIdx->aAvgEq[nCol] = 1;
} }
for(iCol=0; iCol<nCol; iCol++){ for(iCol=0; iCol<nCol; iCol++){
int nSample = pIdx->nSample;
int i; /* Used to iterate through samples */ int i; /* Used to iterate through samples */
tRowcnt sumEq = 0; /* Sum of the nEq values */ tRowcnt sumEq = 0; /* Sum of the nEq values */
tRowcnt nSum = 0; /* Number of terms contributing to sumEq */
tRowcnt avgEq = 0; tRowcnt avgEq = 0;
tRowcnt nDLt = pFinal->anDLt[iCol]; tRowcnt nRow; /* Number of rows in index */
i64 nSum100 = 0; /* Number of terms contributing to sumEq */
i64 nDist100; /* Number of distinct values in index */
if( pIdx->aiRowEst==0 ){
nRow = pFinal->anLt[iCol];
nDist100 = (i64)100 * pFinal->anDLt[iCol];
nSample--;
}else{
nRow = pIdx->aiRowEst[0];
nDist100 = ((i64)100 * pIdx->aiRowEst[0]) / pIdx->aiRowEst[iCol+1];
}
/* Set nSum to the number of distinct (iCol+1) field prefixes that /* Set nSum to the number of distinct (iCol+1) field prefixes that
** occur in the stat4 table for this index before pFinal. Set ** occur in the stat4 table for this index. Set sumEq to the sum of
** sumEq to the sum of the nEq values for column iCol for the same ** the nEq values for column iCol for the same set (adding the value
** set (adding the value only once where there exist duplicate ** only once where there exist duplicate prefixes). */
** prefixes). */ for(i=0; i<nSample; i++){
for(i=0; i<(pIdx->nSample-1); i++){ if( i==(pIdx->nSample-1)
if( aSample[i].anDLt[iCol]!=aSample[i+1].anDLt[iCol] ){ || aSample[i].anDLt[iCol]!=aSample[i+1].anDLt[iCol]
){
sumEq += aSample[i].anEq[iCol]; sumEq += aSample[i].anEq[iCol];
nSum++; nSum100 += 100;
} }
} }
if( nDLt>nSum ){
avgEq = (pFinal->anLt[iCol] - sumEq)/(nDLt - nSum); if( nDist100>nSum100 ){
avgEq = ((i64)100 * (nRow - sumEq))/(nDist100 - nSum100);
} }
if( avgEq==0 ) avgEq = 1; if( avgEq==0 ) avgEq = 1;
pIdx->aAvgEq[iCol] = avgEq; pIdx->aAvgEq[iCol] = avgEq;
@@ -1846,6 +1867,11 @@ int sqlite3AnalysisLoad(sqlite3 *db, int iDb){
rc = loadStat4(db, sInfo.zDatabase); rc = loadStat4(db, sInfo.zDatabase);
db->lookaside.bEnabled = lookasideEnabled; db->lookaside.bEnabled = lookasideEnabled;
} }
for(i=sqliteHashFirst(&db->aDb[iDb].pSchema->idxHash);i;i=sqliteHashNext(i)){
Index *pIdx = sqliteHashData(i);
sqlite3DbFree(db, pIdx->aiRowEst);
pIdx->aiRowEst = 0;
}
#endif #endif
if( rc==SQLITE_NOMEM ){ if( rc==SQLITE_NOMEM ){

View File

@@ -1801,6 +1801,7 @@ struct Index {
int nSampleCol; /* Size of IndexSample.anEq[] and so on */ int nSampleCol; /* Size of IndexSample.anEq[] and so on */
tRowcnt *aAvgEq; /* Average nEq values for keys not in aSample */ tRowcnt *aAvgEq; /* Average nEq values for keys not in aSample */
IndexSample *aSample; /* Samples of the left-most key */ IndexSample *aSample; /* Samples of the left-most key */
tRowcnt *aiRowEst; /* Non-logarithmic stat1 data for this table */
#endif #endif
}; };