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 |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
3bc43594aaeee9225c0590677fcce480 |
User & Date: | drh 2014-05-02 00:09:40.134 |
Context
2014-05-02
| ||
14:54 | Fix a broken test case in fuzz.test. (check-in: faa469355e user: dan tags: trunk) | |
13:09 | Merge latest trunk enhancements and fixes into the orderby-planning branch. (check-in: 84862d3a09 user: drh tags: orderby-planning) | |
00:09 | Add a comment explaining why WhereLoop cost adjustments are omitted for skip-scan loops. (check-in: 3bc43594aa 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: 427409ae10 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; |
︙ | ︙ |