diff options
author | drh <drh@noemail.net> | 2013-09-11 03:53:22 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2013-09-11 03:53:22 +0000 |
commit | abfa6d52edd9e6d37fed8c231cfb4f4e966320e5 (patch) | |
tree | d66e8e98dd8fb7a9e229396ef4f06d412d65bf39 /src | |
parent | 36fabb6297cc242d885f2ab9c15b38e16a47c8dd (diff) | |
download | sqlite-abfa6d52edd9e6d37fed8c231cfb4f4e966320e5.tar.gz sqlite-abfa6d52edd9e6d37fed8c231cfb4f4e966320e5.zip |
Tweaks to the index selection logic.
FossilOrigin-Name: 52d52688644f635a50a60ff17b160f3affa8fa6c
Diffstat (limited to 'src')
-rw-r--r-- | src/resolve.c | 2 | ||||
-rw-r--r-- | src/where.c | 16 |
2 files changed, 12 insertions, 6 deletions
diff --git a/src/resolve.c b/src/resolve.c index ab318be8e..40acc91bc 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -705,7 +705,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ pNC->nErr++; } }else{ - pExpr->iTable = 75; /* TUNING: Default 2nd arg to unlikely() is 0.075 */ + pExpr->iTable = 62; /* TUNING: Default 2nd arg to unlikely() is 0.0625 */ } } } diff --git a/src/where.c b/src/where.c index b50851d37..f2ecb7640 100644 --- a/src/where.c +++ b/src/where.c @@ -2557,6 +2557,7 @@ static int whereRangeScanEst( ){ int rc = SQLITE_OK; int nOut = (int)*pnOut; + WhereCost nNew; #ifdef SQLITE_ENABLE_STAT3_OR_STAT4 Index *p = pBuilder->pNew->u.btree.pIndex; @@ -2619,6 +2620,7 @@ static int whereRangeScanEst( whereKeyStats(pParse, p, pRec, 0, a); iNew = a[0] + ((pLower->eOperator & WO_GT) ? a[1] : 0); if( iNew>iLower ) iLower = iNew; + nOut--; } } @@ -2633,12 +2635,12 @@ static int whereRangeScanEst( whereKeyStats(pParse, p, pRec, 1, a); iNew = a[0] + ((pUpper->eOperator & WO_LE) ? a[1] : 0); if( iNew<iUpper ) iUpper = iNew; + nOut--; } } pBuilder->pRec = pRec; if( rc==SQLITE_OK ){ - WhereCost nNew; if( iUpper>iLower ){ nNew = whereCost(iUpper - iLower); }else{ @@ -2660,13 +2662,17 @@ static int whereRangeScanEst( assert( pLower || pUpper ); /* TUNING: Each inequality constraint reduces the search space 4-fold. ** A BETWEEN operator, therefore, reduces the search space 16-fold */ + nNew = nOut; if( pLower && (pLower->wtFlags & TERM_VNULL)==0 ){ - nOut -= 20; assert( 20==whereCost(4) ); + nNew -= 20; assert( 20==whereCost(4) ); + nOut--; } if( pUpper ){ - nOut -= 20; assert( 20==whereCost(4) ); + nNew -= 20; assert( 20==whereCost(4) ); + nOut--; } - if( nOut<10 ) nOut = 10; + if( nNew<10 ) nNew = 10; + if( nNew<nOut ) nOut = nNew; *pnOut = (WhereCost)nOut; return rc; } @@ -4203,7 +4209,7 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ && p->nLTerm<pTemplate->nLTerm && (p->wsFlags & pTemplate->wsFlags & WHERE_INDEXED)!=0 && (p->u.btree.pIndex==pTemplate->u.btree.pIndex - || p->u.btree.pIndex->nColumn>=pTemplate->u.btree.pIndex->nColumn) + || pTemplate->rRun+p->nLTerm<=p->rRun+pTemplate->nLTerm) ){ /* Overwrite an existing WhereLoop with an similar one that uses ** more terms of the index */ |