Oracle provides several
methods for reducing the
time spent parsing Oracle
SQL statements, which can
cause a drag on
performance when executing
complex queries with a
large number of possible
execution plans. Let’s
briefly examine some of
these methods.
Hinting
around with the ordered
hint
Oracle must spend a great
deal of time parsing
multiple table joins to
determine the optimal
order to join the tables.
SQL statements with table
joins involving seven or
more tables can sometimes
take more than 30 minutes
to parse because Oracle
must evaluate all possible
table join orders. This
can add up to more than
40,000 orders with only
eight tables. The ordered
hint is commonly used in
conjunction with other
hints to suggest a proper
join order.
The ordered hint
requests that the tables
listed in the FROM clause
of a SQL statement be
joined in the order
specified, with the first
table in the FROM clause
specifying the driving
table. The driving table
should be the table that
returns the smallest
number of rows. Using the ordered
hint will bypass the very
expensive and
time-consuming parsing
operation and speed the
execution of Oracle SQL.
In Listing A is an example of
a complex query that is
forced to perform a nested
loop join with a parallel
query on the emp
table. Note that I’ve
used the ordered
hint to direct Oracle to
evaluate the tables in the
order they are presented
in the WHERE clause.
Listing A:
select /*+ ordered use_nl(bonus) parallel(e, 4) */
e.ename,
hiredate,
b.comm
from
emp e,
bonus b
where
e.ename = b.ename
;
Using
the ordered_predicates hint
The ordered_predicates
hint is specified in the
WHERE clause of a query
and is used to specify the
order in which Boolean
predicates should be
evaluated. In the absence
of ordered_predicates,
Oracle uses the following
steps to evaluate the
order of SQL predicates:
- Subqueries are
evaluated before the
outer Boolean
conditions in the
WHERE clause.
- All Boolean
conditions without
built-in functions or
subqueries are
evaluated in reverse
from the order they
are found in the WHERE
clause, with the last
predicate being
evaluated first.
- Boolean predicates
with built-in
functions of each
predicate are
evaluated in
increasing order of
their estimated
evaluation costs.
You can override these
default evaluation rules
using the ordered_predicates
hint, and your WHERE
clause items will then be
evaluated in the order
that they appear in the
query. The ordered_predicates
hint is commonly used in
cases where a PL/SQL
function is used in the
WHERE clause of a query.
It is also very useful in
cases where you know the
most restrictive
predicates and you want
Oracle to evaluate these
first.
Usage
note:
You
cannot use the ordered_predicates
hint to preserve the order
of predicate evaluation on
index keys.
Limit
the number of table join
evaluations
One final way you can
improve the performance of
SQL parsing is to override
Oracle’s parameter that
controls the number of
possible joins evaluated
by the cost-based
optimizer when evaluating
a query. The optimizer_search_limit
parameter specifies the
maximum number of table
join combinations that
will be evaluated when
Oracle tries to decide the
best way to join multiple
tables. This parameter
helps prevent the
optimizer from spending
more time evaluating every
possible join ordering
than could be saved by
finding the optimal join
order. The optimizer_search_limit
parameter also controls
the threshold for invoking
a star join hint,
and a star hint
will be honored when the
number of tables in the
query is less than the optimizer_search_limit.
The default value is 5.
These are just a few of
the tricks that Oracle
DBAs use to optimize the
performance of SQL queries
in an Oracle database
application.
 |
If you like Oracle tuning,
check-out my latest book "Oracle Tuning: The Definitive Reference",
the best deal at 30% off, buying directly from the
publisher.
Packed with almost 1,000 pages of Oracle performance
tuning techniques, it's the foolproof way to find
and correct Oracle bottlenecks. |