aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2013-09-11 03:53:22 +0000
committerdrh <drh@noemail.net>2013-09-11 03:53:22 +0000
commitabfa6d52edd9e6d37fed8c231cfb4f4e966320e5 (patch)
treed66e8e98dd8fb7a9e229396ef4f06d412d65bf39 /src
parent36fabb6297cc242d885f2ab9c15b38e16a47c8dd (diff)
downloadsqlite-abfa6d52edd9e6d37fed8c231cfb4f4e966320e5.tar.gz
sqlite-abfa6d52edd9e6d37fed8c231cfb4f4e966320e5.zip
Tweaks to the index selection logic.
FossilOrigin-Name: 52d52688644f635a50a60ff17b160f3affa8fa6c
Diffstat (limited to 'src')
-rw-r--r--src/resolve.c2
-rw-r--r--src/where.c16
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 */