Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Add a comment explaining why WhereLoop cost adjustments are omitted for skip-scan loops. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
3bc43594aaeee9225c0590677fcce480 |
User & Date: | drh 2014-05-02 00:09:40 |
Context
2014-05-02
| ||
14:54 | Fix a broken test case in fuzz.test. check-in: faa46935 user: dan tags: trunk | |
13:09 | Merge latest trunk enhancements and fixes into the orderby-planning branch. check-in: 84862d3a user: drh tags: orderby-planning | |
00:09 | Add a comment explaining why WhereLoop cost adjustments are omitted for skip-scan loops. check-in: 3bc43594 user: drh tags: trunk | |
2014-05-01
| ||
20:26 | Fix an obscure problem to do with temp register allocation that could occur if more than one simple SELECT within a compound SELECT uses a partial sort. check-in: 427409ae user: dan tags: trunk | |
Changes
Changes to src/where.c.
3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 |
** ** (2) pTemplate costs more than any other WhereLoops for which pTemplate ** is a proper subset. ** ** To say "WhereLoop X is a proper subset of Y" means that X uses fewer ** WHERE clause terms than Y and that every WHERE clause term used by X is ** also used by Y. */ static void whereLoopAdjustCost(const WhereLoop *p, WhereLoop *pTemplate){ if( (pTemplate->wsFlags & WHERE_INDEXED)==0 ) return; if( (pTemplate->wsFlags & WHERE_SKIPSCAN)!=0 ) return; for(; p; p=p->pNextLoop){ if( p->iTab!=pTemplate->iTab ) continue; if( (p->wsFlags & WHERE_INDEXED)==0 ) continue; |
> > > > > > > > > > > |
3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 |
** ** (2) pTemplate costs more than any other WhereLoops for which pTemplate ** is a proper subset. ** ** To say "WhereLoop X is a proper subset of Y" means that X uses fewer ** WHERE clause terms than Y and that every WHERE clause term used by X is ** also used by Y. ** ** This adjustment is omitted for SKIPSCAN loops. In a SKIPSCAN loop, the ** WhereLoop.nLTerm field is not an accurate measure of the number of WHERE ** clause terms covered, since some of the first nLTerm entries in aLTerm[] ** will be NULL (because they are skipped). That makes it more difficult ** to compare the loops. We could add extra code to do the comparison, and ** perhaps we will someday. But SKIPSCAN is sufficiently uncommon, and this ** adjustment is sufficient minor, that it is very difficult to construct ** a test case where the extra code would improve the query plan. Better ** to avoid the added complexity and just omit cost adjustments to SKIPSCAN ** loops. */ static void whereLoopAdjustCost(const WhereLoop *p, WhereLoop *pTemplate){ if( (pTemplate->wsFlags & WHERE_INDEXED)==0 ) return; if( (pTemplate->wsFlags & WHERE_SKIPSCAN)!=0 ) return; for(; p; p=p->pNextLoop){ if( p->iTab!=pTemplate->iTab ) continue; if( (p->wsFlags & WHERE_INDEXED)==0 ) continue; |