Sie sind auf Seite 1von 30

Indexes

An index is a schema object that has the role to provide direct and fast
access without reading the entire table. Indexes are created explicitly or
automatically.

When using indexes you must consider the following tips:

 Create indexes after inserting table data and index on the correct
tables / columns, that are most used in queries.
 Order index columns for performance and limit the number of indexes
for each table.
 Assign index size and set storage parameters.
 Indexes are created in the default tablespace of the schema, you can
specify the tablespace for each index.
 Drop indexes that are no longer useful or no longer needed.
B-tree indexes

B-tree indexes – By default, Oracle Database creates B-tree indexes(normal


indexes).

CREATE INDEX index_name

ON TABLE_NAME(column_name);

Bitmap indexes

The Bitmap indexes store the rowids column value in bits.

CREATE BITMAP INDEX bitmap_index_name

ON TABLE_NAME(column_name)

TABLESPACE tbs_1

LOCAL ( PARTITION ix_p1 TABLESPACE tbs_02,

PARTITION ix_p2,

PARTITION ix_p3 TABLESPACE tbs_03);

Partitioned indexes

Partitioned indexes are partitions that store an entry for each value that
appears in the indexed column of the table.

CREATE INDEX index_name ON TABLE_NAME (column_name)

GLOBAL PARTITION BY RANGE (column_name)

(PARTITION p1 VALUES LESS THAN (100),

PARTITION p2 VALUES LESS THAN (200),

PARTITION p3 VALUES LESS THAN (MAXVALUE));


Function-based indexes

Function-based indexes are based on expressions. You can build queries that
evaluate the value returned by an expression.

CREATE INDEX index_name

ON TABLE_NAME(UPPER(column_name));

Domain indexes

A domain index is an instance of an index which is accessed by routines


supplied by an indextype.
Create index oracle examples

Alter index oracle examples

Drop index oracle example

Create index oracle examples


Below are a list of oracle pl/sql create index examples.

You can learn how create indexes like: B-tree, bitmap, cluster index, explicit
index, unique index, function-based, index with collect statistics.

 B-tree index
 Compressing an Index
 Create Index in NOLOGGING Mode
 Create Cluster Index
 Create Function-Based Index
 Create Composite Index
 Create Range-Partitioned Global Index
 Create Hash-Partitioned Global Index
 Create Index on a Hash-Partitioned Table
 Create Bitmap Index
 Explicit Index
 Unique Explicit Index
 Index Associated with a Constraint
 Index with Collect Statistics
 Create Index Online
B-tree index example

CREATE INDEX student_idx

ON STUDENTS_LIST (student_id);

Outpout:

index STUDENT_IDX created.

Check index:

SELECT INDEX_NAME, INDEX_TYPE, TABLE_NAME

FROM USER_INDEXES

WHERE TABLE_NAME='STUDENTS_LIST';

Outpout:

INDEX_NAME INDEX_TYPE TABLE_NAME

STUDENT_IDX NORMAL STUDENTS_LIST

Compressing an Index example

CREATE TABLE ORDERS

(ORDER_ID NUMBER NOT NULL ENABLE,

COURSE_ID NUMBER NOT NULL ENABLE,

STUDENT_ID NUMBER NOT NULL ENABLE,

ORDER_DATE DATE,

CONSTRAINT PK_ORDER_ID PRIMARY KEY (ORDER_ID)

);
CREATE INDEX student_orders_idx

ON ORDERS (student_id, order_id)

COMPRESS 1;

Outpout:

table ORDERS created.

index STUDENT_ORDERS_IDX created.

Check indexes:

SELECT INDEX_NAME, INDEX_TYPE, COMPRESSION

FROM USER_INDEXES

WHERE TABLE_NAME='ORDERS';

Outpout:

INDEX_NAME INDEX_TYPE COMPRESSION

PK_ORDER_ID NORMAL DISABLED

STUDENT_ORDERS_IDX NORMAL ENABLED

Create Index in NOLOGGING Mode example

CREATE TABLE ORDERS

(ORDER_ID NUMBER NOT NULL ENABLE,

COURSE_ID NUMBER NOT NULL ENABLE,

STUDENT_ID NUMBER NOT NULL ENABLE,

ORDER_DATE DATE,

CONSTRAINT PK_ORDER_ID PRIMARY KEY (ORDER_ID) );


CREATE INDEX orders_idx_nologging

ON orders (student_id)

NOLOGGING;

Outpout:

table ORDERS created.

index ORDERS_IDX_NOLOGGING created.

Check indexes:

SELECT INDEX_NAME, INDEX_TYPE, LOGGING

FROM USER_INDEXES

WHERE TABLE_NAME='ORDERS';

Outpout:

INDEX_NAME INDEX_TYPE LOGGING

PK_ORDER_ID NORMAL YES

ORDERS_IDX_NOLOGGING NORMAL NO

Create Cluster Index example

CREATE CLUSTER course_cluster

(course NUMBER(9))

SIZE 512

STORAGE (initial 100K next 50K);

CREATE INDEX idx_course_cluster

ON CLUSTER course_cluster;
Outpout:

cluster COURSE_CLUSTER created.

index IDX_COURSE_CLUSTER created.

Check cluster:

SELECT CLUSTER_NAME, TABLESPACE_NAME, CLUSTER_TYPE

FROM USER_CLUSTERS;

Outpout:

CLUSTER_NAME TABLESPACE_NAME CLUSTER_TYPE

COURSE_CLUSTER SYSTEM INDEX

Check index:

SELECT INDEX_NAME, INDEX_TYPE, TABLE_NAME

FROM USER_INDEXES WHERE INDEX_TYPE='CLUSTER';

Outpout:

INDEX_NAME INDEX_TYPE TABLE_NAME

IDX_COURSE_CLUSTER CLUSTER COURSE_CLUSTER

Create Function-Based Index example

CREATE INDEX CITY_IDX

ON STUDENTS (UPPER(CITY));

CREATE INDEX PRICE_IDX

ON COURSE(PRICE - DISCOUNT);
Outpout:

index CITY_IDX created.

index PRICE_IDX created.

Check indexes:

SELECT INDEX_NAME, INDEX_TYPE, FUNCIDX_STATUS

FROM USER_INDEXES

WHERE INDEX_NAME IN

(SELECT OBJECT_NAME FROM

(SELECT * FROM USER_OBJECTS

WHERE OBJECT_TYPE='INDEX' ORDER BY CREATED DESC)

WHERE ROWNUM < =2);

Outpout:

INDEX_NAME INDEX_TYPE FUNCIDX_STATUS

PRICE_IDX FUNCTION-BASED NORMAL ENABLED

CITY_IDX FUNCTION-BASED NORMAL ENABLED

Create Composite Index example

CREATE UNIQUE INDEX orders_unique_index

ON ORDERS (ORDER_ID, COURSE_ID, STUDENT_ID);

Outpout:

unique index ORDERS_UNIQUE_INDEX created.

Check indexes:
SELECT INDEX_NAME, INDEX_TYPE, UNIQUENESS

FROM USER_INDEXES

WHERE TABLE_NAME='ORDERS';

Outpout:

INDEX_NAME INDEX_TYPE UNIQUENESS

PK_ORDER_ID NORMAL UNIQUE

ORDERS_UNIQUE_INDEX NORMAL UNIQUE

Create Range-Partitioned Global Index example

CREATE INDEX amount_idx ON orders (amount)

GLOBAL PARTITION BY RANGE (amount)

(PARTITION p1 VALUES LESS THAN (500),

PARTITION p2 VALUES LESS THAN (1500),

PARTITION p3 VALUES LESS THAN (MAXVALUE));

Outpout:

index AMOUNT_IDX created.

Check indexes:

SELECT INDEX_NAME, INDEX_TYPE, PARTITIONED

FROM USER_INDEXES

WHERE TABLE_NAME='ORDERS';

Outpout:
INDEX_NAME INDEX_TYPE PARTITIONED

PK_ORDER_ID NORMAL NO

ORDERS_UNIQUE_INDEX NORMAL NO

AMOUNT_IDX NORMAL YES

Create Hash-Partitioned Global Index example

CREATE INDEX stu_last_name_idx ON STUDENTS_LIST (LAST_NAME)

GLOBAL PARTITION BY HASH (LAST_NAME)

PARTITIONS 2;

Outpout:

index STU_LAST_NAME_IDX created.

Check indexes:

SELECT INDEX_NAME, INDEX_TYPE, PARTITIONED

FROM USER_INDEXES

WHERE TABLE_NAME='STUDENTS_LIST';

Outpout:

INDEX_NAME INDEX_TYPE PARTITIONED

STUDENT_IDX NORMAL NO

STU_LAST_NAME_IDX NORMAL YES


Create Index on a Hash-Partitioned Table example

CREATE TABLESPACE tbs_01

DATAFILE 'tbs_01.dat' SIZE 20M ONLINE;

CREATE TABLESPACE tbs_02

DATAFILE 'tbs_02.dat' SIZE 20M ONLINE;

CREATE TABLE test_course

( course_id NUMBER(6) PRIMARY KEY,

course_name VARCHAR2(250))

PARTITION BY HASH (course_id)

PARTITIONS 2

STORE IN (tbs_01, tbs_02);

CREATE INDEX test_course_idx

ON test_course(course_name) LOCAL

STORE IN (tbs_01, tbs_02);

Outpout:

tablespace TBS_01 created.

tablespace TBS_02 created.

table TEST_COURSE created.

index TEST_COURSE_IDX created.

Check indexes:

SELECT INDEX_NAME, INDEX_TYPE, PARTITIONED


FROM USER_INDEXES

WHERE TABLE_NAME='TEST_COURSE';

Outpout:

INDEX_NAME INDEX_TYPE PARTITIONED

SYS_C009931 NORMAL NO

TEST_COURSE_IDX NORMAL YES

Create Bitmap Index example

CREATE TABLESPACE tbs_01

DATAFILE 'tbs_01.dat' SIZE 20M ONLINE;

CREATE TABLESPACE tbs_02

DATAFILE 'tbs_02.dat' SIZE 20M ONLINE;

CREATE TABLESPACE tbs_03

DATAFILE 'tbs_03.dat' SIZE 20M ONLINE;

CREATE TABLE test_course (

course_id NUMBER(9) PRIMARY KEY,

course_name VARCHAR2(250),

price NUMBER

) PARTITION BY HASH (course_id)

PARTITIONS 3

STORE IN (tbs_01, tbs_02, tbs_03);


CREATE BITMAP INDEX course_tab_idx

ON test_course(price)

LOCAL(PARTITION ix_p1 TABLESPACE tbs_01,

PARTITION ix_p2,

PARTITION ix_p3 TABLESPACE tbs_02)

TABLESPACE tbs_03;

Outpout:

tablespace TBS_01 created.

tablespace TBS_02 created.

tablespace TBS_03 created.

table TEST_COURSE created.

bitmap index COURSE_TAB_IDX created.

Check indexes:

SELECT INDEX_NAME, INDEX_TYPE, PARTITIONED

FROM USER_INDEXES

WHERE TABLE_NAME='TEST_COURSE';

Outpout:

INDEX_NAME INDEX_TYPE PARTITIONED

COURSE_TAB_IDX BITMAP YES

SYS_C009932 NORMAL NO
Create Explicit Index example

CREATE INDEX last_name_idx

ON STUDENTS_LIST(LAST_NAME)

TABLESPACE SYSTEM

STORAGE (INITIAL 10K

NEXT 10k

PCTINCREASE 75);

Outpout:

index LAST_NAME_IDX created.

Check indexes:

SELECT INDEX_NAME, INDEX_TYPE, TABLESPACE_NAME

FROM USER_INDEXES

WHERE TABLE_NAME='STUDENTS_LIST';

Outpout:

INDEX_NAME INDEX_TYPE TABLESPACE_NAME

STUDENT_IDX NORMAL SYSTEM

LAST_NAME_IDX NORMAL SYSTEM


Create Unique Explicit Index example

CREATE UNIQUE INDEX phone_unique_idx

ON PHONE_BRANDS(NAME)

TABLESPACE SYSTEM

STORAGE (INITIAL 10K

NEXT 10k

PCTINCREASE 75);

Outpout:

unique index PHONE_UNIQUE_IDX created.

Check indexes:

SELECT INDEX_NAME, INDEX_TYPE, TABLESPACE_NAME

FROM USER_INDEXES

WHERE TABLE_NAME='PHONE_BRANDS';

Outpout:

INDEX_NAME INDEX_TYPE TABLESPACE_NAME

PK_BRAND_ID NORMAL SYSTEM

PHONE_UNIQUE_IDX NORMAL SYSTEM


Create Index Associated with a Constraint example

CREATE TABLE t_table (

c1 NUMBER PRIMARY KEY

USING INDEX (create index t_idx on t_table (c1)),

c2 NUMBER);

CREATE TABLE t2_table(t1 NUMBER, t2 NUMBER);

CREATE INDEX t2_idx

ON t2_table (t1, t2);

ALTER TABLE t2_table

ADD CONSTRAINT t2_pk

PRIMARY KEY (t1)

USING INDEX t2_idx;

Outpout:

table T_TABLE created.

table T2_TABLE created.

index T2_IDX created.

table T2_TABLE altered.

Check indexes:

SELECT INDEX_NAME, INDEX_TYPE, TABLE_NAME

FROM USER_INDEXES

WHERE TABLE_NAME IN ('T_TABLE','T2_TABLE');


Outpout:

INDEX_NAME INDEX_TYPE TABLE_NAME

T_IDX NORMAL T_TABLE

T2_IDX NORMAL T2_TABLE

Create Index with Collect Statistics example

CREATE INDEX stu_ln_idx

ON STUDENTS_LIST(LAST_NAME)

COMPUTE STATISTICS;

Outpout:

index STU_LN_IDX created.

Check index:

SELECT INDEX_NAME, INDEX_TYPE, TABLESPACE_NAME

FROM USER_INDEXES

WHERE TABLE_NAME='STUDENTS_LIST';

Outpout:

INDEX_NAME INDEX_TYPE TABLESPACE_NAME

STU_LN_IDX NORMAL SYSTEM


Create Index Online example

CREATE INDEX stu_on_idx

ON STUDENTS_LIST (FIRST_NAME, LAST_NAME)

ONLINE;

Outpout:

index STU_ON_IDX created.

Check index:

SELECT INDEX_NAME, INDEX_TYPE, TABLESPACE_NAME

FROM USER_INDEXES

WHERE TABLE_NAME='STUDENTS_LIST';

Outpout:

INDEX_NAME INDEX_TYPE TABLESPACE_NAME

STU_ON_IDX NORMAL SYSTEM


Alter index oracle examples
Below are a list of oracle pl/sql alter index examples.

You can learn how to alter indexes using commands like: rename an index,
disable an index, drop index partition, rebuild index, collect statistics.

 Rename an Index
 Disable an Index
 Enable an Index
 Disable an Function-Based Index
 Enable an Function-Based Index
 Rename an Index Partition
 Drop an Index Partition
 Disable an Index Partition
 Enable an Index Partition
 Collect Index Statistics
 Set an Index Parallel
 Rebuild an Index Partition

Rename Index example

ALTER INDEX STUDENT_IDX

RENAME TO STUDENT_IDX_2;

Outpout:

index STUDENT_IDX altered.

Check index:

SELECT INDEX_NAME, INDEX_TYPE, TABLESPACE_NAME

FROM USER_INDEXES

WHERE TABLE_NAME='STUDENTS_LIST';
Outpout:

INDEX_NAME INDEX_TYPE TABLESPACE_NAME

STUDENT_IDX_2 NORMAL SYSTEM

Disable an Index example

To disable an oracle database index you must use the command alter index
with unusable keyword. The status of index will change FROM valid to
unusable.

ALTER INDEX STU_LN_IDX UNUSABLE;

Outpout:

index STU_LN_IDX altered.

Check indexes:

SELECT INDEX_NAME, INDEX_TYPE, STATUS

FROM USER_INDEXES

WHERE TABLE_NAME='STUDENTS_LIST';

Outpout:

INDEX_NAME INDEX_TYPE STATUS

STUDENT_IDX NORMAL VALID

STU_LN_IDX NORMAL UNUSABLE


Enable an Index example

In Oracle database to enable an index you must use the command alter index
with rebuild keyword. The status of index will change FROM unusable to
valid.

ALTER INDEX STU_LN_IDX REBUILD;

Outpout:

index STU_LN_IDX altered.

Check indexes:

SELECT INDEX_NAME, INDEX_TYPE, STATUS

FROM USER_INDEXES

WHERE TABLE_NAME='STUDENTS_LIST';

Outpout:

INDEX_NAME INDEX_TYPE STATUS

STUDENT_IDX NORMAL VALID

STU_LN_IDX NORMAL VALID

Disable an Function-Based Index example

To disable an oracle database Function-Based index you must use the


command alter index with DISABLE keyword. The status of index will
change FROM enable to disable.

ALTER INDEX CITY_IDX DISABLE;


Outpout:

index CITY_IDX altered.

Check indexes:

SELECT INDEX_NAME, INDEX_TYPE, STATUS, FUNCIDX_STATUS

FROM USER_INDEXES

WHERE TABLE_NAME='STUDENTS';

Outpout:

INDEX_NAME INDEX_TYPE STATUS FUNCIDX_STATUS

PK_STUDENT_ID NORMAL VALID (null)

CITY_IDX FUNCTION-BASED NORMAL VALID DISABLED

Enable an Function-Based Index example

To enable an oracle database Function-Based index you must use the


command alter index with ENABLE keyword. The status of index will
change FROM disable to enable.

ALTER INDEX CITY_IDX ENABLE;

Outpout:

index CITY_IDX altered.

Check indexes:

SELECT INDEX_NAME, INDEX_TYPE, STATUS, FUNCIDX_STATUS

FROM USER_INDEXES

WHERE TABLE_NAME='STUDENTS';
Outpout:

INDEX_NAME INDEX_TYPE STATUS FUNCIDX_STATUS

PK_STUDENT_ID NORMAL VALID (null)

CITY_IDX FUNCTION-BASED NORMAL VALID ENABLED

Rename an Index Partition example

In oracle database to rename an index partition you must use the command
alter index with RENAME PARTITION keyword.

CREATE INDEX amount_idx ON orders (amount)

GLOBAL PARTITION BY RANGE (amount)

(PARTITION part_1 VALUES LESS THAN (1000),

PARTITION part_2 VALUES LESS THAN (2000),

PARTITION part_3 VALUES LESS THAN (MAXVALUE));

ALTER INDEX amount_idx

RENAME PARTITION part_1 TO p1;

Outpout:

index AMOUNT_IDX created.

index AMOUNT_IDX altered.

Check partitions:

SELECT INDEX_NAME, PARTITION_NAME, PARTITION_POSITION

FROM USER_IND_PARTITIONS

WHERE INDEX_NAME='AMOUNT_IDX';
Outpout:

INDEX_NAME PARTITION_NAME PARTITION_POSITION

AMOUNT_IDX P1 1

AMOUNT_IDX PART_2 2

AMOUNT_IDX PART_3 3

Drop an Index Partition example

In oracle database to drop an index partition you must use the command alter
index with DROP PARTITION keyword.

CREATE INDEX amount_idx ON orders (amount)

GLOBAL PARTITION BY RANGE (amount)

(PARTITION part_1 VALUES LESS THAN (1000),

PARTITION part_2 VALUES LESS THAN (2000),

PARTITION part_3 VALUES LESS THAN (MAXVALUE));

ALTER INDEX AMOUNT_IDX

DROP PARTITION part_2;

Outpout:

index AMOUNT_IDX created.

index AMOUNT_IDX altered.

Check partitions:

SELECT INDEX_NAME, PARTITION_NAME, PARTITION_POSITION

FROM USER_IND_PARTITIONS
WHERE INDEX_NAME='AMOUNT_IDX';

Outpout:

INDEX_NAME PARTITION_NAME PARTITION_POSITION

AMOUNT_IDX PART_1 1

AMOUNT_IDX PART_3 2

Disable an Index Partition example

In oracle database to disable an index partition you must use the command
alter index with UNUSABLE keyword.

CREATE INDEX amount_idx ON orders (amount)

GLOBAL PARTITION BY RANGE (amount)

(PARTITION part_1 VALUES LESS THAN (1000),

PARTITION part_2 VALUES LESS THAN (2000),

PARTITION part_3 VALUES LESS THAN (MAXVALUE));

ALTER INDEX amount_idx

MODIFY PARTITION part_2 UNUSABLE;

Outpout:

index AMOUNT_IDX created.

index AMOUNT_IDX altered.

Check partitions:

SELECT INDEX_NAME, PARTITION_NAME, STATUS

FROM USER_IND_PARTITIONS
WHERE INDEX_NAME='AMOUNT_IDX';

Outpout:

INDEX_NAME PARTITION_NAME STATUS

AMOUNT_IDX PART_1 USABLE

AMOUNT_IDX PART_2 UNUSABLE

AMOUNT_IDX PART_3 USABLE

Enable an Index Partition example

In oracle database to enable an index partition you must use the command
alter index with REBUILD PARTITION keyword.

ALTER INDEX amount_idx

REBUILD PARTITION part_2;

Outpout:

index AMOUNT_IDX altered.

Check partitions:

SELECT INDEX_NAME, PARTITION_NAME, STATUS

FROM USER_IND_PARTITIONS

WHERE INDEX_NAME='AMOUNT_IDX';

Outpout:

INDEX_NAME PARTITION_NAME STATUS

AMOUNT_IDX PART_1 USABLE


AMOUNT_IDX PART_2 USABLE

AMOUNT_IDX PART_3 USABLE

Collect Index Statistics example

In Oracle database to collect an index statistics you must use the command
alter index with REBUILD COMPUTE STATISTICS keyword.

ALTER INDEX STU_LN_IDX

REBUILD COMPUTE STATISTICS;

Outpout:

index STU_LN_IDX altered.

Set Index Parallel example

In Oracle database to set an index parallel you must use the command alter
index with REBUILD PARALLEL keyword.

ALTER INDEX STU_LN_IDX

REBUILD

PARALLEL;

Outpout:

index STU_LN_IDX altered.

Check indexes:

SELECT INDEX_NAME, DEGREE, INSTANCES

FROM USER_INDEXES

WHERE TABLE_NAME='STUDENTS_LIST';
Outpout:

INDEX_NAME DEGREE INSTANCES

STUDENT_IDX 1 1

STU_LN_IDX DEFAULT DEFAULT

Rebuild an Index Partition example

In oracle database to rebuild an index partition you must use the command
alter index with REBUILD PARTITION keyword.

CREATE INDEX amount_idx ON orders (amount)

GLOBAL PARTITION BY RANGE (amount)

(PARTITION part_1 VALUES LESS THAN (1000),

PARTITION part_2 VALUES LESS THAN (2000),

PARTITION part_3 VALUES LESS THAN (MAXVALUE));

ALTER INDEX AMOUNT_IDX

REBUILD PARTITION PART_1 NOLOGGING;

Outpout:

index AMOUNT_IDX created.

index AMOUNT_IDX altered.

Check partitions:

SELECT INDEX_NAME, PARTITION_NAME, LOGGING


FROM USER_IND_PARTITIONS

WHERE INDEX_NAME='AMOUNT_IDX';

Outpout:

INDEX_NAME PARTITION_NAME LOGGING

AMOUNT_IDX PART_1 NO

AMOUNT_IDX PART_2 YES

AMOUNT_IDX PART_3 YES

Drop index oracle example


You can remove unnecessary indexes FROM oracle database using pl/sql
command drop index.

Syntax:

DROP INDEX index_name;

Example:

DROP INDEX AMOUNT_IDX;

Outpout:

index AMOUNT_IDX dropped.

Resources:

http://docs.oracle.com/cloud/latest/db121/SQLRF/statements_5013.htm#SQLRF012
09

http://www.plsql.co/
http://www.plsql.co/indexes.html

Das könnte Ihnen auch gefallen