From: drh Date: Sat, 8 Dec 2012 22:14:29 +0000 (+0000) Subject: Factor some work out of the index loop of the bestBtreeIndex() routine for X-Git-Tag: version-3.7.15~6 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=04229acebc835aaa932d6c933615f56089a15496;p=thirdparty%2Fsqlite.git Factor some work out of the index loop of the bestBtreeIndex() routine for a small performance increase. FossilOrigin-Name: 92c9ab56b1c67b9468bec57ab1d2c483a69a2810 --- diff --git a/manifest b/manifest index 49f4593615..9c89093a19 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Refactor\scollating-sequence\shandling\sas\sa\sfix\sfor\sticket\s[71e333e7d2e642].\nThe\sExpr.pColl\sfield\sis\sremoved\sfrom\sthe\sExpr\sobject.\s\sThe\sCOLLATE\soperator\nnow\sbecomes\sa\sseparate\sinstance\sof\sExpr\sin\sthe\sexpression\stree.\s\sThe\scode\ngenerator\slooks\sup\sthe\scorrect\scollating\sfunction\sas\sneeded,\srather\sthan\nreferring\sto\sExpr.pColl. -D 2012-12-08T21:51:24.433 +C Factor\ssome\swork\sout\sof\sthe\sindex\sloop\sof\sthe\sbestBtreeIndex()\sroutine\sfor\na\ssmall\sperformance\sincrease. +D 2012-12-08T22:14:29.324 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 690d441a758cbffd13e814dc2724a721a6ebd400 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -250,7 +250,7 @@ F src/vtab.c b05e5f1f4902461ba9f5fc49bb7eb7c3a0741a83 F src/wal.c f5c7b5027d0ed0e9bc9afeb4a3a8dfea762ec7d2 F src/wal.h 29c197540b19044e6cd73487017e5e47a1d3dac6 F src/walker.c 3d75ba73de15e0f8cd0737643badbeb0e002f07b -F src/where.c b613cf5be71a34c85e3a85782d9ea44bba8ea373 +F src/where.c 53b991af50dab230b319b098bcb90fc7cd82da47 F test/8_3_names.test 631ea964a3edb091cf73c3b540f6bcfdb36ce823 F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 45c0201e28045ad38a530b5a144b73cd4aa2cfd6 @@ -1025,7 +1025,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381 F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac -P 2d5f37c99a9e5377409697f5392a1ca55970964e cdbfa664839a409589ec7cebfc9111235d2f3b38 -R fd5c21e14054b78f0a72082ceca653a9 +P 8542e6180d4321d45b34f33e481658908ce1430d +R 307714a402bf6d86beef10997fbac787 U drh -Z 9b6ace21d2c8985753646add41f3f044 +Z c87a5a2068dc4b6318f0ce8f3372ea0a diff --git a/manifest.uuid b/manifest.uuid index 46d93323f8..5047e5ef81 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8542e6180d4321d45b34f33e481658908ce1430d \ No newline at end of file +92c9ab56b1c67b9468bec57ab1d2c483a69a2810 \ No newline at end of file diff --git a/src/where.c b/src/where.c index e5e497ad01..98369db6d2 100644 --- a/src/where.c +++ b/src/where.c @@ -3032,6 +3032,11 @@ static void bestBtreeIndex(WhereBestIdx *p){ tRowcnt aiRowEstPk[2]; /* The aiRowEst[] value for the sPk index */ int aiColumnPk = -1; /* The aColumn[] value for the sPk index */ int wsFlagMask; /* Allowed flags in p->cost.plan.wsFlag */ + int nPriorSat; /* ORDER BY terms satisfied by outer loops */ + int nOrderBy; /* Number of ORDER BY terms */ + char bSortInit; /* Initializer for bSort in inner loop */ + char bDistInit; /* Initializer for bDist in inner loop */ + /* Initialize the cost to a worst-case value */ memset(&p->cost, 0, sizeof(p->cost)); @@ -3081,6 +3086,17 @@ static void bestBtreeIndex(WhereBestIdx *p){ pIdx = 0; } + nOrderBy = p->pOrderBy ? p->pOrderBy->nExpr : 0; + if( p->i ){ + nPriorSat = p->aLevel[p->i-1].plan.nOBSat; + bSortInit = nPriorSat0; + bDistInit = p->pDistinct!=0; + } + /* Loop over all indices looking for the best one to use */ for(; pProbe; pIdx=pProbe=pProbe->pNext){ @@ -3158,11 +3174,9 @@ static void bestBtreeIndex(WhereBestIdx *p){ int nInMul = 1; /* Number of distinct equalities to lookup */ double rangeDiv = (double)1; /* Estimated reduction in search space */ int nBound = 0; /* Number of range constraints seen */ - int bSort; /* True if external sort required */ - int bDist; /* True if index cannot help with DISTINCT */ - int bLookup = 0; /* True if not a covering index */ - int nPriorSat; /* ORDER BY terms satisfied by outer loops */ - int nOrderBy; /* Number of ORDER BY terms */ + char bSort = bSortInit; /* True if external sort required */ + char bDist = bDistInit; /* True if index cannot help with DISTINCT */ + char bLookup = 0; /* True if not a covering index */ WhereTerm *pTerm; /* A single term of the WHERE clause */ #ifdef SQLITE_ENABLE_STAT3 WhereTerm *pFirstTerm = 0; /* First term matching the index */ @@ -3173,16 +3187,7 @@ static void bestBtreeIndex(WhereBestIdx *p){ pSrc->pTab->zName, (pIdx ? pIdx->zName : "ipk") )); memset(&pc, 0, sizeof(pc)); - nOrderBy = p->pOrderBy ? p->pOrderBy->nExpr : 0; - if( p->i ){ - nPriorSat = pc.plan.nOBSat = p->aLevel[p->i-1].plan.nOBSat; - bSort = nPriorSat0; - bDist = p->pDistinct!=0; - } + pc.plan.nOBSat = nPriorSat; /* Determine the values of pc.plan.nEq and nInMul */ for(pc.plan.nEq=0; pc.plan.nEqnColumn; pc.plan.nEq++){