In the optimization approaches discussed above,
starting with Selinger
(which was based on SQL data model),
the intend was to create a full-model
(e.g. full-relational or full-SQL, etc.)
query optimizer.
Here we look at techniques
that have focussed on
part of the model.
Specialized optimizers
and specific optimization techniques
have been developed
that focus on a particular
aspect,
operator or set of operators,
rather than on the entire optimization process.
[Chaudhuri 94] and [Yan 94]
focus on group_by (aggregation),
[Levy 94]
looks at moving predicates around
and [Pellenkoft 96] looks at unique rules
for generating all join orders.
[Chaudhuri 94]
shows three successive transformations
for
pushing an
aggregate operator
through a join.
It is expected that
the application of the aggregate operator
will reduce the cardinality
of a table.
Since the subsequent joins will
join smaller tables, the
cost of performing the joins
will be less.
Predicate move around
extends the ideas
applied in the System R optimizer and elsewhere
of pushing selection down,
through joins
and other operators.
As with the aggregation,
the idea is to reduce the cardinality
of the tables, and thus reduce the
cost of subsequent operations.
[Levy 94]
extends this idea to allow predicates
to be moved "around" --
up, down and sideways --
instead of just down.
Their model
is an optimization process
involving
multiple query blocks,
and so they
analyze when predicates
can be moved
from one query block
to another.
Thus,
it might be
used
in conjunction with
the query rewrite mechanism
of [Pirahesh 92].
Their approach
makes use
of functional dependencies
in identifying
legal transformations,
and is
one of the motivations
for tracking functional dependencies
as a logical property.