A key is a column or expression on which you can build an index. Follow these guidelines for choosing keys to index:
- Consider indexing keys that are used frequently in
WHERE
clauses. - Consider indexing keys that are used frequently to join tables in SQL statements. For more information on optimizing joins, see the section "Using Hash Clusters".
- Index keys that have high selectivity. The selectivity of an index is the percentage of rows in a table having the same value for the indexed key. An index's selectivity is optimal if few rows have the same value.
Note:Oracle automatically creates indexes, or uses existing indexes, on the keys and expressions of unique and primary keys that you define with integrity constraints.
Indexing low selectivity columns can be helpful if the data distribution is skewed so that one or two values occur much less often than other values.
- Do not use standard B-tree indexes on keys or expressions with few distinct values. Such keys or expressions usually have poor selectivity and therefore do not optimize performance unless the frequently selected key values appear less frequently than the other key values. You can use bitmap indexes effectively in such cases, unless a high concurrency OLTP application is involved where the index is modified frequently.
- Do not index columns that are modified frequently.
UPDATE
statements that modify indexed columns andINSERT
andDELETE
statements that modify indexed tables take longer than if there were no index. Such SQL statements must modify data in indexes as well as data in tables. They also generate additional undo and redo. - Do not index keys that appear only in
WHERE
clauses with functions or operators. AWHERE
clause that uses a function, other thanMIN
orMAX
, or an operator with an indexed key does not make available the access path that uses the index except with function-based indexes. - Consider indexing foreign keys of referential integrity constraints in cases in which a large number of concurrent
INSERT
,UPDATE
, andDELETE
statements access the parent and child tables. Such an index allowsUPDATE
s andDELETE
s on the parent table without share locking the child table. - When choosing to index a key, consider whether the performance gain for queries is worth the performance loss for
INSERT
s,UPDATE
s, andDELETE
s and the use of the space required to store the index. You might want to experiment by comparing the processing times of the SQL statements with and without indexes. You can measure processing time with the SQL trace facility.See Also: Oracle9i Application Developer's Guide - Fundamentals for more information on the effects of foreign keys on locking
Choosing Composite Indexes
A composite index contains more than one key column. Composite indexes can provide additional advantages over single-column indexes:
- Improved selectivity
Sometimes two or more columns or expressions, each with poor selectivity, can be combined to form a composite index with higher selectivity.
- Reduced I/O
If all columns selected by a query are in a composite index, then Oracle can return these values from the index without accessing the table.
A SQL statement can use an access path involving a composite index if the statement contains constructs that use a leading portion of the index.
Note: This is no longer the case with index skip scans. See "Index Skip Scans". |
A leading portion of an index is a set of one or more columns that were specified first and consecutively in the list of columns in the CREATE
INDEX
statement that created the index. Consider this CREATE
INDEX
statement:
CREATE INDEX comp_ind
ON table1(x, y, z);
-
x
,xy
, andxyz
combinations of columns are leading portions of the index -
yz
,y
, andz
combinations of columns are not leading portions of the index
Choosing Keys for Composite Indexes
Follow these guidelines for choosing keys for composite indexes:
- Consider creating a composite index on keys that are used together frequently in
WHERE
clause conditions combined withAND
operators, especially if their combined selectivity is better than the selectivity of either key individually. - If several queries select the same set of keys based on one or more key values, then consider creating a composite index containing all of these keys.
Of course, consider the guidelines associated with the general performance advantages and trade-offs of indexes described in the previous sections.
Ordering Keys for Composite Indexes
Follow these guidelines for ordering keys in composite indexes:
- Create the index so the keys used in
WHERE
clauses make up a leading portion. - If some keys are used in
WHERE
clauses more frequently, then be sure to create the index so that the more frequently selected keys make up a leading portion to allow the statements that use only these keys to use the index. - If all keys are used in
WHERE
clauses equally often, then ordering these keys from most selective to least selective in theCREATE
INDEX
statement best improves query performance. - If all keys are used in the
WHERE
clauses equally often but the data is physically ordered on one of the keys, then place that key first in the composite index.