Hints for Oracle sql performance
Database Sql Functions Packages Performance Books Oracle Other About XML ORA-messages
Info on performance dbms_profiler explained How to use hints Undocumented hints How to Trace sessions Create statistics
How to use hints in Oracle sql for performance
With hints one can influence the optimizer. The usage of hints (with exception of the RULE-hint) causes Oracle to use the Cost Based optimizer. The following syntax is used for hints: select /*+ HINT */ name from emp where id =1; Where HINT is replaced by the hint text. When the syntax of the hint text is incorrect, the hint text is ignored and will not be used. here you can find undocumented hints.
Ads by Google Tune Oracle 9I Hint SQL SQL Monitoring Oracle PL SQL
Hints for Optimization Approaches and Goals
The ALL_ROWS hint explicitly chooses the cost-based approach to optimize a statement block with a goal of best throughput (that is, minimum total resource consumption). The FIRST_ROWS hint explicitly chooses the cost-based approach to optimize a statement block with a goal of best response time (minimum resource usage to return first row). In newer Oracle version you should give a parameter with this hint: FIRST_ROWS(n) means that the optimizer will determine an executionplan to give a fast response for returning the first n rows. The CHOOSE hint causes the optimizer to choose between the rule-based approach and the cost-based approach for a SQL statement based on the presence of statistics for the tables accessed by the statement The RULE hint explicitly chooses rule-based optimization for a statement block. This hint also causes the optimizer to ignore any other hints specified for the statement block. The RULE hint does not work any more in Oracle 10g.
Hints for Access Paths
The FULL hint explicitly chooses a full table scan for the specified table. The syntax of the FULL hint is FULL(table) where table
1 of 6
12/20/2010 7:41 AM
Oracle scans the index entries in ascending order of their indexed values. The syntax of the NO_INDEX hint is NO_INDEX(table index) The INDEX_ASC hint explicitly chooses an index scan for the specified table. For the hint to have a positive effect. If the statement uses an index range scan. This hint causes a fast full index scan to be performed rather than a full table. The syntax of INDEX_COMBINE is INDEX_COMBINE(table index). The syntax of the INDEX hint is INDEX(table index) where:table specifies the name or alias of the table associated with the index to be scanned and index specifies an index on which an index scan is to be performed.com/hints.jsp
specifies the alias of the table (or table name if alias does not exist) on which the full table scan is to be performed. If no indexes are given as arguments for the INDEX_COMBINE hint. The ROWID hint explicitly chooses a table scan by ROWID for the specified table. The syntax of the CLUSTER hint is CLUSTER(table) where table specifies the name or alias of the table to be accessed by a cluster scan. The HASH hint explicitly chooses a hash scan to access the specified table. If certain indexes are given as arguments. the optimizer will try to use some boolean combination of those particular bitmap indexes.(depricated in Oracle 10g) The INDEX hint explicitly chooses an index scan for the specified table. Oracle scans the index entries in descending order of their indexed values. The syntax of the HASH hint is HASH(table) where table specifies the name or alias of the table to be accessed by a hash scan.Hints for Oracle sql performance
http://www. (This hint depricated in Oracle 10g) The CLUSTER hint explicitly chooses a cluster scan to access the specified table. Explicitly instructs the optimizer to use an index join as an access path.oradev. If the statement uses an index range scan. The INDEX_DESC hint explicitly chooses an index scan for the specified table. the optimizer will use on the table whatever boolean combination of bitmap indexes has the best cost estimate.
2 of 6
12/20/2010 7:41 AM
. The syntax of the HASH_AJ hint is HASH_AJ(table) where table specifies the name or alias of the table to be accessed. a sufficiently small number of indexes must exist that contain all the columns required to resolve the query. This hint may optionally specify one or more indexes: The NO_INDEX hint explicitly disallows a set of indexes for the specified table. The syntax of the ROWID hint is ROWID(table) where table specifies the name or alias of the table on which the table access by ROWID is to be performed. The HASH_AJ hint transforms a NOT IN subquery into a hash anti-join to access the specified table.
com/hints. (from Oracle 10g)
Hints for Query Transformations
NO_QUERY_TRANSFORMATION Prevents the optimizer performing query transformations.jsp
NO_INDEX_FFS INDEX_SS INDEX_SS_ASC INDEX_SS_DESC
Do not use fast full index scan (from Oracle 10g) Exclude range scan from query plan (from Oracle 10g) Exclude range scan from query plan (from Oracle 10g) Exclude range scan from query plan (from Oracle 10g) The NO_INDEX_SS hint causes the optimizer to exclude a skip scan of the specified indexes on the specified table. (from Oracle 10g) The USE_CONCAT hint forces combined OR conditions in the WHERE clause of a query to be transformed into a compound query using the UNION ALL set operator. this transformation occurs only if the cost of the query using the concatenations is cheaper than the cost without them. Use the REWRITE hint with or without a view list.oradev. The NO_EXPAND hint prevents the optimizer from considering OR-expansion for queries having OR conditions or IN-lists in the WHERE clause. Without the hint. If you use REWRITE with a view list and the list contains an eligible materialized view. Normally. The FACT hint indicated that the table should be considered as a fact table. The MERGE hint lets you merge views in a query. This is used in the context of the star transformation. The NO_FACT hint is used in the context of the star transformation to indicate to the transformation that the hinted table should not be considered as a fact table. The STAR_TRANSFORMATION hint makes the optimizer use the best plan in which the transformation has been used. The NO_MERGE hint causes Oracle not to merge mergeable views.
NOREWRITE / NO_REWRITE
3 of 6
12/20/2010 7:41 AM
. This hint is most often used to reduce the number of possible permutations for a query and make optimization faster. without cost consideration.Hints for Oracle sql performance
http://www. The NOREWRITE/NO_REWRITE hint disables query rewrite for the query block. overriding the setting of the parameter QUERY_REWRITE_ENABLED. the optimizer considers using OR expansion and uses this method if it decides that the cost is lower than not using it. when possible. the optimizer could make a query optimization decision to use the best plan generated without the transformation. Usually. In Oracle 10g renamed to NO_REWRITE. instead of the best plan for the transformed query. The REWRITE hint forces the optimizer to rewrite a query in terms of materialized views. then Oracle uses that view regardless of its cost.
(from Oracle 10g) The USE_MERGE hint causes Oracle to join each specified table with another row source with a sort-merge join. The syntax of the USE_MERGE hint is USE_MERGE(table table) where table is a table to be joined to the row source resulting from joining the previous tables in the join order using a sort-merge join. This will indicate only 1 table. Syntax: LEADING(table) The ORDERED hint causes Oracle to join tables in the order in which they appear in the FROM clause. Do not use merge (from Oracle 10g) The USE_HASH hint causes Oracle to join each specified table with another row source with a hash join. Such information would allow you to choose an inner and outer table better than the optimizer could. The PARALLEL hint must use the table alias if an alias is specified in the query. Use of the NO_UNNEST hint turns off unnesting for specific subquery blocks.jsp
NO_STAR_TRANSFORMATION UNNEST NO_UNNEST
Do not use star transformation (from Oracle 10g) The UNNEST hint specifies subquery unnesting.
Hints for Join Orders
Give this hint to indicate the leading table in a join.com/hints.
Hints for Join Operations
The USE_NL hint causes Oracle to join each specified table to another row source with a nested loops join using the specified table as the inner table. The syntax of the USE_HASH hint is USE_HASH(table table) where table is a table to be joined to the row source resulting from joining the previous tables in the join order using a hash join. The syntax is PARALLEL(table number number). The PARALLEL hint can then take two values separated by commas after the
NO_USE_HASH Hints for Parallel Execution
4 of 6
12/20/2010 7:41 AM
. you can use the ORDERED hint. Do not use hash (from Oracle 10g) The PARALLEL hint allows you to specify the desired number of concurrent query servers that can be used for the query. Do not use nested loop (from Oracle 10g) Specifies a nested loops join.oradev. You may want to use the ORDERED hint to specify a join order if you know something about the number of rows selected from each table that the optimizer does not. If you omit the ORDERED hint from a SQL statement performing a join .Hints for Oracle sql performance
http://www. The syntax of the USE_NL hint is USE_NL(table table) where table is the name or alias of a table to be used as the inner table of a nested loops join. If you want to specify the whole order of tables. the optimizer chooses the order in which to join the tables.
Existing free space in the block is not used.Hints for Oracle sql performance
http://www. If a table or an index is specified with nologging. In other words. the CACHE hint overrides the table default caching specification.oradev. Overrides the append mode. data is appended to the table. (from Oracle 10g) Oracle can replace literals in SQL statements with bind variables. This is the normal behavior of blocks in the buffer cache. In the following example.
NOPARALLEL / NO_PARALLEL
NO_PARALLEL_INDEX Additional Hints
PUSH_PRED NO_PUSH_PRED PUSH_SUBQ
5 of 6
12/20/2010 7:41 AM
. The PUSH_SUBQ hint causes nonmerged subqueries to be evaluated at the earliest possible place in the execution plan. The PQ_DISTRIBUTE hint improves the performance of parallel join operations. The first value specifies the degree of parallelism for the given table. The NO_PARALLEL_INDEX hint overrides a PARALLEL attribute setting on an index to avoid a parallel index scan operation. When the APPEND hint is used with the INSERT statement. The NO_PUSH_SUBQ hint causes non-merged subqueries to be evaluated as the last step in the execution plan. this hint applied with an insert statement produces a direct path insert which reduces generation of redo. Using this hint overrides decisions the optimizer would normally make. Oracle executes the SQL statement without any attempt to replace literals by bind variables. even if the table was created with a PARALLEL clause. The NOPARALLEL hint allows you to disable parallel scanning of a table. Specifying DEFAULT or no value signifies the query coordinator should examine the settings of the initialization parameters (described in a later section) to determine the default degree of parallelism. the second value specifies how the table is to be split among the instances of a parallel server. This option is useful for small lookup tables. if it is safe to do so. In Oracle 10g this hint was renamed to NO_PARALLEL. The NOCACHE hint specifies that the blocks retrieved for this table are placed at the least recently used end of the LRU list in the buffer cache when a full table scan is performed. The CURSOR_SHARING_EXACT hint causes this behavior to be switched off. The NO_PUSH_PRED hint prevents pushing of a join predicate into the view.com/hints. The CACHE hint specifies that the blocks retrieved for the table in the hint are placed at the most recently used end of the LRU list in the buffer cache when a full table scan is performed. The PUSH_PRED hint forces pushing of a join predicate into the view. Specifies a name for a query block. Do this by specifying how rows of joined tables should be distributed among producer and consumer query servers.jsp
table name. This is controlled with the CURSOR_SHARING startup parameter.
com/hints. You must specify at least two indexes. (depricated in Oracle 10g) Use an anti-join in a sub-query. Use this when your high volume NOT IN sub-query is using a FILTER or NESTED LOOPS join. (depricated in Oracle 10g) Usage: BITMAP(table_name index_name) Uses a bitmap index to access the table. The syntax of the AND_EQUAL hint is AND_EQUAL(table index index) where table specifies the name or alias of the table associated with the indexes to be merged. Some optimizations such as creating filters to selectively populate spreadsheet access structures and limited rule pruning are still used. Use this hint in the sub-query.oradev. You can set the value of DYNAMIC_SAMPLING to a value from 0 to 10.(depricated in Oracle 10g) Use a Nested Loop in a sub-query. (depricated in Oracle 10g) The STAR hint forces the large table to be joined last using a nested loops join on the index. You cannot specify more than five.(depricated in Oracle 10g) The AND_EQUAL hint explicitly chooses an execution plan that uses an access path that merges the scans on several singlecolumn indexes. (depricated in Oracle 10g) (depricated in Oracle 10g) (depricated in Oracle 10g)
SQL Optimizer SQL Tuning SQL Optimizing
Hints with unknown status
NL_SJ NL_AJ ORDERED_PREDICATES EXPAND_GSET_TO_UNION
Ads by Google Oracle
6 of 6
12/20/2010 7:41 AM
. Sampling defaults to cursor level unless you specify a table. The higher the level.jsp
The DRIVING_SITE hint forces query execution to be done for the table at a different site than that selected by Oracle The DYNAMIC_SAMPLING hint lets you control dynamic sampling to improve server performance by determining more accurate predicate selectivity and statistics for tables and indexes. not in the main query. the more effort the compiler puts into dynamic sampling and the more broadly it is applied. mainly detailed dependency graph analysis. The optimizer will consider different permutations of the small tables. Try MERGE_AJ if HASH_AJ refuses to work. (from Oracle 10g) The MERGE_AJ hint transforms a NOT IN subquery into a merge anti-join to access the specified table. (depricated ?) Use a Hash Anti-Join to evaluate a NOT IN sub-query. on spreadsheets. and index specifies an index on which an index scan is to be performed. This hint omits some of the compile time optimizations of the rules.Hints for Oracle sql performance
http://www. The syntax of the MERGE_AJ hint is MERGE_AJ(table) where table specifies the name or alias of the table to be accessed.