Oracle8i SQL Reference Release 3 (8.1.7) Part Number A85397-01 |
|
SQL Statements:
CREATE CLUSTER to CREATE SEQUENCE, 10 of 25
Use the CREATE
INDEX
statement to create an index on
An index is a schema object that contains an entry for each value that appears in the indexed column(s) of the table or cluster and provides direct, fast access to rows. Oracle supports several types of index:
See Also:
To create an index in your own schema, one of the following conditions must be true:
INDEX
privilege on the table to be indexed.
CREATE
ANY
INDEX
system privilege.
To create an index in another schema, you must have CREATE
ANY
INDEX
system privilege. Also, the owner of the schema to contain the index must have either space quota on the tablespaces to contain the index or index partitions, or UNLIMITED
TABLESPACE
system privilege.
To create a domain index in your own schema, in addition to the prerequisites for creating a conventional index, you must also have EXECUTE
privilege on the indextype. If you are creating a domain index in another user's schema, the index owner also must have EXECUTE
privilege on the indextype and its underlying implementation type. Before creating a domain index, you should first define the indextype. See .
To create a function-based index in your own schema on your own table, in addition to the prerequisites for creating a conventional index, you must have the QUERY
REWRITE
system privilege. To create the index in another schema or on another schema's table, you must have the GLOBAL
QUERY
REWRITE
privilege. In both cases, the table owner must also have the EXECUTE
object privilege on the function(s) used in the function-based index. In addition, in order for Oracle to use function-based indexes in queries, the QUERY_REWRITE_ENABLED
parameter must be set to true
, and the QUERY_REWRITE_INTEGRITY
parameter must be set to trusted
.
global_partition_clause
::=
on_range_partitioned_table_clause::=
segment_attributes_clause
::=
on_hash_partitioned_table_clause::=
on_composite_partitioned_table_clause::=
storage_clause
: See storage_clause.
UNIQUE
Specify UNIQUE
to indicate that the value of the column (or columns) upon which the index is based must be unique. If the index is local nonprefixed (see below), then the index key must contain the partitioning key.
Oracle recommends that you do not explicitly define UNIQUE
indexes on tables. Uniqueness is strictly a logical concept and should be associated with the definition
of a table. Therefore, define UNIQUE
integrity constraints on the desired columns.
Restrictions:
BITMAP
Specify BITMAP
to indicate that index
is to be created as a bitmap, rather than as a B-tree. Bitmap indexes store the rowids associated with a key value as a bitmap. Each bit in the bitmap corresponds to a possible rowid, and if the bit is set, it means that the row with the corresponding rowid contains the key value. The internal representation of bitmaps is best suited for applications with low levels of concurrent transactions, such as data warehousing.
Restrictions:
BITMAP
when creating a global partitioned index or an index-organized table.
UNIQUE
and BITMAP
.
BITMAP
for a domain index.
See Also: Oracle8i Concepts and Oracle8i Performance Guide and Reference for more information about using bitmap indexes
schema
Specify the schema to contain the index. If you omit schema
, Oracle creates the index in your own schema.
index
Specify the name of the index to be created. An index
can contain several partitions.
cluster_index_clause
Use the cluster_index_clause
to identify the cluster for which a cluster index is to be created. If you do not qualify cluster with schema
, Oracle assumes the cluster is in your current schema. You cannot create a cluster index for a hash cluster.
table_index_clause
Specify the table (and its attributes) on which you are defining the index. If you do not qualify table
with schema
, Oracle assumes the table is contained in your own schema.
You create an index on a nested table column by creating the index on the nested table storage table. Include the NESTED_TABLE_ID
pseudocolumn of the storage table to create a UNIQUE
index, which effectively ensures that the rows of a nested table value are distinct.
Restrictions:
table
must be partitioned.
BITMAP
or REVERSE
for this secondary index, and the combined size of the index key and the logical rowid should be less than half the block size.
table
is a temporary table, the index will also be temporary with the same scope (session or transaction) as table
. The following restrictions apply to indexes on temporary table:
physical_attributes_clause
or the parallel_clause
.
LOGGING
, NOLOGGING
, or TABLESPACE
.
|
Specify a correlation name (alias) for the table upon which you are building the index. |
|
|
|
index_expr_list
The index_expr_list
lets you specify the column or column expression upon which the index is based.
|
Specify the name of a column in the table. A bitmap index can have a maximum of 30 columns. Other indexes can have as many as 32 columns.
Restriction: You cannot create an index on columns or attributes whose type is user-defined, |
|
|
You can create an index on a scalar object attribute column or on the system-defined |
|
|
is an expression built from columns of
Name resolution of the function is based on the schema of the index creator. User-defined functions used in |
|
|
After creating a function-based index, collect statistics on both the index and its base table using the
|
|
|
Notes on function-based indexes:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Restrictions on function-based indexes: |
|
|
||
|
||
|
||
|
||
|
|
|
|
Use
Oracle treats descending indexes as if they were function-based indexes. You do not need the
Restriction: You cannot specify either of these clauses for a domain index. You cannot specify |
index_attributes
|
Use the
Restriction: You cannot specify the |
|
|
|
Specify the percentage of space to leave free for updates and insertions within each of the index's data blocks. |
|
|
Use the storage_clause to establish the storage characteristics for the index. |
|
Specify the name of the tablespace to hold the index, index partition, or index subpartition. If you omit this clause, Oracle creates the index in the default tablespace of the owner of the schema containing the index. |
|
|
For a local index, you can specify the keyword |
|
|
Specify
|
|
|
Oracle compresses only nonpartitioned indexes that are nonunique or unique indexes of at least two columns.
Restriction: You cannot specify |
|
|
Specify |
|
|
Specify Restrictions: |
|
|
Specify |
|
|
You cannot reverse a bitmap index or an index-organized table. |
|
|
Indicate whether the creation of the index will be logged ( |
|
|
If |
|
|
If
|
|
|
In |
|
|
If the database is run in |
|
|
The logging attribute of the index is independent of that of its base table. |
|
|
If you omit this clause, the logging attribute is that of the tablespace in which it resides. |
|
|
|
|
|
Specify
Restriction: Parallel DML is not supported during online index building. If you specify
|
|
|
Specify The types of statistics collected depend on the type of index you are creating. |
|
|
||
|
Additional methods of collecting statistics are available in PL/SQL packages and procedures. |
|
|
Specify the |
global_index_clause
The global_index_clause
lets you specify that the partitioning of the index is user defined and is not equipartitioned with the underlying table. By default, nonpartitioned indexes are global indexes.
|
Specify |
|
|
Specify the name of the column(s) of a table on which the index is partitioned. The |
|
|
You cannot specify more than 32 columns in |
|
|
|
|
|
The |
|
|
Specify the (noninclusive) upper bound for the current partition in a global index. The Restriction: You cannot specify this clause for a local index. |
|
|
|
|
|
|
local_index_clauses
The local_index_clauses
let you specify that the index is partitioned on the same columns, with the same number of partitions and the same partition bounds as table
. Oracle automatically maintains LOCAL
index partitioning as the underlying table is repartitioned.
|
Specify the name and attributes of an index on a range-partitioned table. |
|
|
|
Specify the names of the individual partitions. The number of clauses determines the number of partitions. For a local index, the number of index partitions must be equal to the number of the table partitions, and in the same order.
If you omit |
|
Specify the name and attributes of an index on a hash-partitioned table. If you do not specify
You can optionally specify |
|
|
Specify the name and attributes of an index on a composite-partitioned table. The first
If you do not specify |
|
|
The |
|
|
|
The |
|
|
The |
|
Use the Restrictions:
|
|
|
|
Specify the table columns or object attributes on which the index is defined. Each Restrictions: |
|
|
Specify the name of the indextype. This name should be a valid schema object that you have already defined.
|
|
|
Specify the parameter string that is passed uninterpreted to the appropriate indextype routine. The maximum length of the parameter string is 1000 characters.
Once the domain index is created, Oracle invokes this routine (see .) If the routine does not return successfully, the domain index is marked |
PARALLEL
Example
The following statement creates an index using 10 parallel execution servers, 5 to scan scott.emp
and another 5 to populate the emp_ix
index:
CREATE INDEX emp_idx ON scott.emp (ename) PARALLEL 5;
COMPRESS
Example
To create an index with the COMPRESS
clause, you might issue the following statement:
CREATE INDEX emp_idx2 ON emp(job, ename) COMPRESS 1;
The index will compress repeated occurrences of job
column values.
NOLOGGING
Example
To quickly create an index in parallel on a table that was created using a fast parallel load (so all rows are already sorted), you might issue the following statement. (Oracle will choose the appropriate degree of parallelism.)
CREATE INDEX i_loc ON big_table (akey) NOSORT NOLOGGING PARALLEL;
To create an index for the employee
cluster, issue the following statement:
CREATE INDEX ic_emp ON CLUSTER employee;
No index columns are specified, because the index is automatically built on all the columns of the cluster key. For cluster indexes, all rows are indexed.
NULL
Example
Consider the following statement:
SELECT ename FROM emp WHERE comm IS NULL;
The above query does not use an index created on the comm
column unless it is a bitmap index.
The following statements creates a function-based index on the emp
table based on an uppercase evaluation of the ename
column:
CREATE INDEX emp_i ON emp (UPPER(ename));
To ensure that Oracle will use the index rather than performing a full table scan, be sure that the value of the function is not null in subsequent queries. For example, the statement
SELECT * FROM emp WHERE UPPER(ename) IS NOT NULL ORDER BY UPPER(ename);
is guaranteed to use the index, but without the WHERE
clause, Oracle may perform a full table scan.
In the next statements showing index creation and subsequent query, Oracle will use index emp_fi
even though the columns are in reverse order in the query:
CREATE INDEX emp_fi ON emp(cola + colb); SELECT * FROM emp WHERE colb + cola > 500;
This example entails an object type rectangle
containing two number attributes: length and width. The area()
method computes the area of the rectangle.
CREATE TYPE rectangle AS OBJECT ( length NUMBER, width NUMBER, MEMBER FUNCTION area RETURN NUMBER DETERMINISTIC ); CREATE OR REPLACE TYPE BODY rectangle AS MEMBER FUNCTION area RETURN NUMBER IS BEGIN RETURN (length*width); END; END;
Now, if you create a table rectab
of type rectangle
, you can create a function-based index on the area()
method as follows:
CREATE TABLE recttab OF rectangle; CREATE INDEX area_idx ON recttab x (x.area());
You can use this index efficiently to evaluate a query of the form:
SELECT * FROM recttab x WHERE x.area() > 100;
The following statement collects statistics on the nonpartitioned emp_indx
index:
CREATE INDEX emp_indx ON emp(empno) COMPUTE STATISTICS;
The type of statistics collected depends on the type of index you are creating.
The following statement creates a global prefixed index stock_ix
on table stock_xactions
with two partitions, one for each half of the alphabet. The index partition names are system generated:
CREATE INDEX stock_ix ON stock_xactions (stock_symbol, stock_series) GLOBAL PARTITION BY RANGE (stock_symbol) (PARTITION VALUES LESS THAN ('N') TABLESPACE ts3, PARTITION VALUES LESS THAN (MAXVALUE) TABLESPACE ts4);
This statement creates a local index on the item
column of the sales
table. The STORE
IN
clause immediately following LOCAL
indicates that sales
is hash partitioned. Oracle will distribute the hash partitions between the tbs1
and tbs2
tablespaces:
CREATE INDEX sales_idx ON sales(item) LOCAL STORE IN (tbs1, tbs2);
This statement creates a local index on the sales
table, which is composite-partitioned. The STORAGE
clause specifies default storage attributes for the index. The STORE
IN
clause specifies one or more default tablespaces for the index subpartitions. However, this default is overridden for the four subpartitions of partition q3_1977
, because separate TABLESPACE
is specified.
CREATE INDEX sales_idx ON sales(sale_date, item) STORAGE (INITIAL 1M, MAXEXTENTS UNLIMITED) LOCAL STORE IN (tbs1, tbs2, tbs3, tbs4, tbs5) (PARTITION q1_1997, PARTITION q2_1997, PARTITION q3_1997 (SUBPARTITION q3_1997_s1 TABLESPACE ts2, SUBPARTITION q3_1997_s2 TABLESPACE ts4, SUBPARTITION q3_1997_s3 TABLESPACE ts6, SUBPARTITION q3_1997_s4 TABLESPACE ts8), PARTITION q4_1997, PARTITION q1_1998);
To create a bitmap partitioned index on a table with four partitions, issue the following statement:
CREATE BITMAP INDEX partno_ixON lineitem(partno) TABLESPACE ts1 LOCAL (PARTITION quarter1 TABLESPACE ts2, PARTITION quarter2 STORAGE (INITIAL 10K NEXT 2K), PARTITION quarter3 TABLESPACE ts2, PARTITION quarter4);
In the following example, UNIQUE
index uniq_proj_indx
is created on storage table nested_project_table
. Including pseudocolumn nested_table_id
ensures distinct rows in nested table column projs_managed
:
CREATE TYPE proj_type AS OBJECT (proj_num NUMBER, proj_name VARCHAR2(20)); CREATE TYPE proj_table_type AS TABLE OF proj_type; CREATE TABLE employee ( emp_num NUMBER, emp_name CHAR(31), projs_managed proj_table_type ) NESTED TABLE projs_managed STORE AS nested_project_table; CREATE UNIQUE INDEX uniq_proj_indx ON nested_project_table ( NESTED_TABLE_ID, proj_num);
|
![]() Copyright © 1996-2000, Oracle Corporation. All Rights Reserved. |
|