INDEXES IN SQL
Indexes
are special lookup tables that the database search engine can use to speed up
data retrieval. Simply put, an index is a pointer to data in a table. An index
in a database is very similar to an index in the back of a book.
For example,
if you want to reference all pages in a book that discuss a certain topic, you
first refer to the index, which lists all topics alphabetically, and are then
referred to one or more specific page numbers.
An index
helps speed up SELECT queries and WHERE clauses, but it slows down data input,
with UPDATE and INSERT statements. Indexes can be created or dropped with no
effect on the data.
Creating
an index involves the CREATE INDEX statement, which allows you to name the
index, to specify the table and which column or columns to index, and to
indicate whether the index is in ascending or descending order.
Indexes
can also be unique, similar to the UNIQUE constraint, in that the index
prevents duplicate entries in the column or combination of columns on which
there's an index.
The
CREATE INDEX Command:
The basic
syntax of CREATE INDEX is as follows:
CREATE INDEX
index_name ON table_name;
Single-Column
Indexes:
A
single-column index is one that is created based on only one table column. The
basic syntax is as follows:
CREATE INDEX
index_name
ON table_name (column_name);
Unique
Indexes:
Unique
indexes are used not only for performance, but also for data integrity. A
unique index does not allow any duplicate values to be inserted into the table.
The basic syntax is as follows:
CREATE INDEX
index_name
on table_name (column_name);
Composite
Indexes:
A
composite index is an index on two or more columns of a table. The basic syntax
is as follows:
CREATE INDEX
index_name
on table_name (column1, column2);
Whether
to create a single-column index or a composite index, take into consideration
the column(s) that you may use very frequently in a query's WHERE clause as
filter conditions.
Should
there be only one column used, a single-column index should be the choice. Should
there be two or more columns that are frequently used in the WHERE clause as
filters, the composite index would be the best choice.
Implicit
Indexes:
Implicit
indexes are indexes that are automatically created by the database server when
an object is created. Indexes are automatically created for primary key
constraints and unique constraints.
The DROP
INDEX Command:
An index
can be dropped using SQL DROP command. Care should be taken when
dropping an index because performance may be slowed or improved.
The basic
syntax is as follows:
DROP INDEX index_name;
When
should indexes be avoided?
Although
indexes are intended to enhance a database's performance, there are times when
they should be avoided. The following guidelines indicate when the use of an
index should be reconsidered:
- Indexes should not be used on small tables.
- Tables that have frequent, large batch update
or insert operations.
- Indexes should not be used on columns that
contain a high number of NULL values.
- Columns that are frequently manipulated should
not be indexed.
Indexes have three main uses:
- To quickly find specific rows by avoiding a
Full Table Scan
We've
already seen above how a Unique Scan works. Using the phone book metaphor, it's
not hard to understand how a Range Scan works in much the same way to find all
people named "Gallileo", or all of the names alphabetically between
"Smith" and "Smythe". Range Scans can occur when we use
>, <, LIKE, or BETWEEN in a WHERE clause. A range scan will find the
first row in the range using the same technique as the Unique Scan, but will
then keep reading the index up to the end of the range. It is OK if the range
covers many blocks.
- To avoid a table access altogether
If
all we wanted to do when looking up Gallileo in the phone book was to find his
address or phone number, the job would be done. However if we wanted to know
his date of birth, we'd have to phone and ask. This takes time. If it was
something that we needed all the time, like an email address, we could save
time by adding it to the phone book.
Oracle
does the same thing. If the information is in the index, then it doesn't bother
to read the table. It is a reasonably common technique to add columns to an
index, not because they will be used as part of the index scan, but because
they save a table access. In fact, Oracle may even perform a Fast Full Scan of
an index that it cannot use in a Range or Unique scan just to avoid a table
access.
- To avoid a sort
This one is not so well known,
largely because it is so poorly documented (and in many cases, unpredicatably
implemented by the Optimizer as well). Oracle performs a sort for many reasons:
ORDER BY,
GROUP BY,
DISTINCT,
Set operations (eg. UNION), Sort-Merge Joins, uncorrelated IN-subqueries,
Analytic Functions). If a sort operation requires rows in the same order as the
index, then Oracle may read the table rows via the index. A sort operation is
not necessary since the rows are returned in sorted order.
Partitioned Tables And Indexes
Maintenance of large tables and
indexes can become very time and resource consuming. At the same time, data
access performance can reduce drastically for these objects. Partitioning of
tables and indexes can benefit the performance and maintenance in several ways.
- Partition independance means backup and recovery
operations can be performed on individual partitions, whilst leaving the
other partitons available.
- Query performance can be improved as access can be
limited to relevant partitons only.
- There is a greater ability for parallelism with more
partitions.
All the examples shown here use
the users tablespace for all partitions. In a real situation it is likely that
these partitions would be assigned to different tablespaces to reduce device
contention.
- Range
Partitioning Tables
- Hash
Partitioning Tables
- Composite
Partitioning Tables
- Partitioning
Indexes
- Local Prefixed
Indexes
- Local
Non-Prefixed Indexes
- Global Prefixed
Indexes
- Global
Non-Prefixed Indexes
- Partitioning
Existing Tables
Related articles.
- Partitioning
Enhancements In Oracle9i
- Hash Partitioned
Global Indexes in Oracle 10g
- Partitioning
Enhancements in Oracle Database 11g Release 1
- Partitioning an
Existing Table using DBMS_REDEFINITION
- Partitioning an
Existing Table using EXCHANGE PARTITION
Source: Wikipedia.
No comments:
Post a Comment