It is a perfect valid question to ask
why hints should be used. Oracle comes with an optimizer that promises to
optimize a query's execution
plan. When this optimizer is really doing a good job, no hints
should be required at all.
Sometimes, however, the characteristics
of the data in the database are changing rapidly, so that the optimizer (or
more accuratly, its statistics) are out of date. In this case, a hint could
help.
You should first get the explain plan
of your SQL and determine what changes can be done to make the code operate
without using hints if possible. However, hints such as ORDERED, LEADING, INDEX,
FULL, and the various AJ and SJ hints can take a wild optimizer and give you
optimal performance
Tables analyze and update Analyze
Statement
The ANALYZE statement can be used to
gather statistics for a specific table, index or cluster. The statistics can be
computed exactly, or estimated based on a specific number of rows, or a
percentage of rows:
ANALYZE TABLE employees COMPUTE
STATISTICS;
ANALYZE TABLE employees ESTIMATE
STATISTICS SAMPLE 15 PERCENT;
EXEC
DBMS_STATS.gather_table_stats('SCOTT', 'EMPLOYEES');
Automatic Optimizer Statistics
Collection
By default Oracle 10g automatically
gathers optimizer statistics using a scheduled job called GATHER_STATS_JOB. By
default this job runs within maintenance windows between 10 P.M. to 6 A.M. week
nights and all day on weekends. The job calls the
DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC internal procedure which gathers
statistics for tables with either empty or stale statistics, similar to the
DBMS_STATS.GATHER_DATABASE_STATS procedure using the GATHER AUTO option. The
main difference is that the internal job prioritizes the work such that tables
most urgently requiring statistics updates are processed first.
Hint categories:
Hints can be categorized as follows:
- ALL_ROWS
One of the hints that 'invokes' the Cost based optimizer
ALL_ROWS is usually used for batch processing or data warehousing systems.
(/*+ ALL_ROWS */)
- FIRST_ROWS
One of the hints that 'invokes' the Cost based optimizer
FIRST_ROWS is usually used for OLTP systems.
(/*+ FIRST_ROWS */)
- CHOOSE
One of the hints that 'invokes' the Cost based optimizer
This hint lets the server choose (between ALL_ROWS and FIRST_ROWS, based on statistics gathered.
- Hints for Join Orders,
- Hints for Join Operations,
- Hints for Parallel Execution, (/*+ parallel(a,4)
*/) specify degree either 2 or 4 or
16
- Additional Hints
- HASH
Hashes one table (full scan) and creates a hash index for that table. Then hashes other table and uses hash index to find corresponding records. Therefore not suitable for < or > join conditions.
/*+ use_hash */
Use Hint to force using index
SELECT /*+INDEX (TABLE_NAME INDEX_NAME) */ COL1,COL2 FROM TABLE_NAME
Select
( /*+ hash */ ) empno from
ORDERED-à This hint forces tables to be joined in the order
specified. If you know table X has fewer rows, then ordering it first may speed
execution in a join.
PARALLEL (table, instances)àThis specifies the operation is to be done in parallel.
If index is not able to create then
will go for /*+ parallel(table,
8)*/-----For select and update example---in where clase like st,not in
,>,< ,<> then we will use.
This comment has been removed by the author.
ReplyDeleteThis comment has been removed by the author.
ReplyDelete