this dynamic programming approach,
of all possible join orders
to be too expensive.
dealt with the join problem
by using heuristics to reduce the search space.
reduce the number of join order
which are considered.
Selinger reduced the search space first
by considering only left-deep join trees
(i.e. precluding the much larger, bushy tree search space).
A query tree is
if for every join,
the right input
is not the result
of a previous join.
Figure 4.1 shows a left deep join tree.