You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by Jeffrey Lichtman <sw...@rcn.com> on 2006/02/16 19:26:50 UTC

Re: [jira] Commented: (DERBY-805) Push join predicates into union and other set operations. DERBY-649 implemented scalar (single table) predicate pushdown. Adding join predicate push down could improve performance significantly.

>>How could a predicate be pushable to only one side of a union? Can 
>>you provide an example of a predicate that can be pushed only to one side?
>
>If we take something along the lines of:
>
>select ... from
>   t2,
>   (select * from t1 union values (1,2), (3,4), (5,6)) X1 (a,b)
>where X1.a = t2.i;
>
>In this case the predicate X1.a = t2.i could be pushed to the left 
>("select * from t1") and used when reading T1, but couldn't be 
>pushed to the VALUES clause  because there's no underlying table.

OK. One way to deal with this is to put a ProjectRestrictNode between 
the union node and the values clause as a place to park the 
predicate. To make things simple, you might want to always put 
ProjectRestrictNodes under both sides of the union during 
preprocessing (i.e. after binding but before optimization). In some 
cases the extra nodes won't be needed, but ProjectRestrictNodes (and 
the corresponding ProjectRestrictResultSets) are cheap. Also, you 
could eliminate unnecessary ProjectRestrictNodes at the end of 
optimization (possibly in modifyAccessPaths()).

This approach would give better performance in some cases, and could 
simplify the code (since you wouldn't have to figure out when the 
predicates are pushable).


                        -        Jeff Lichtman
                                 swazoo@rcn.com
                                 Check out Swazoo Koolak's Web Jukebox at
                                 http://swazoo.com/