Three ways to speed up SQL execution in Oracle
March 25, 2003 - Donald Burleson
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.
