Oracle Database - Indexes
There are several types of index structures available to depending on the need.
Create index indexname on tablename (columnname); ![]() Before Creating B-tree Index: For example we have an scott user with emp table.
SQL> conn scott/tiger
Connected.
SQL> show user
USER is "SCOTT"
select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---- ------ ----- ------- ------- ----- ------ ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT x 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
SQL> desc user_indexes
Name Null? Type
SQL> select index_name,index_type,status,table_name from user_indexes;
SQL> select ename from emp where ename='SMITH';
ENAME
----------
SMITH
SQL> explain plan for select ename from emp where ename='SMITH';
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 7 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| EMP | 1 | 7 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("ENAME"='SMITH')
Note:
-----
- dynamic statistics used: dynamic sampling (level=2)
17 rows selected.
![]() After Creating a BTREE INDEX:
SQL> create index idx on emp(ename);
Index created.
SQL> select index_name,index_type,status,table_name from user_indexes;
INDEX_NAME INDEX_TYPE STATUS TABLE_NAME
-------------------- -------------------- -------- -----
PK_DEPT NORMAL VALID DEPT
PK_EMP NORMAL VALID EMP
IDX NORMAL VALID EMP
SQL> select ename from emp where ename='SMITH';
ENAME
----------
SMITH
SQL> explain plan for select ename from emp where ename='SMITH';
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------
Plan hash value: 2353645359
-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 7 | 1 (0)| 00:00:01 |
|* 1 | INDEX RANGE SCAN| IDX | 1 | 7 | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("ENAME"='SMITH')
Note
-----
- dynamic statistics used: dynamic sampling (level=2)
17 rows selected.
![]() Bitmap Index
Create bitmap index indexname on tablename(columnname); Bitmap Index An bitmap index entry uses a bitmap to point to multiple rows.
SQL> select job from emp where job='CLERK';
JOB
---------
CLERK
CLERK
CLERK
CLERK
SQL> explain plan for select job from emp where job='CLERK';
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 24 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| EMP | 4 | 24 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
--------------------------------------------------
1 - filter("JOB"='CLERK')
Note
-----
- dynamic statistics used: dynamic sampling (level=2)
17 rows selected.
![]() Creating bitmap index:
SQL> create bitmap index bi on emp(job);
Index created.
SQL> select index_name,index_type,status,table_name from
user_indexes;
INDEX_NAME INDEX_TYPE STATUS TABLE_NAME
-------------------- -------------------- -------- --------
PK_DEPT NORMAL VALID DEPT
PK_EMP NORMAL VALID EMP
BI BITMAP VALID EMP
IDX NORMAL VALID EMP
SQL> explain plan for select job from emp where job='CLERK';
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------
Plan hash value: 4150301131
-------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 24 | 1 (0)| 00:00:01 |
| 1 | BITMAP CONVERSION TO ROWIDS | | 4 | 24 | 1 (0)| 00:00:01 |
|* 2 | BITMAP INDEX FAST FULL SCAN| BI | | | | |
-------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("JOB"='CLERK')
Note
-----
- dynamic statistics used: dynamic sampling (level=2)
18 rows selected.
![]() Function Based Index :
This Index includes columns that are either transformed by a function.
SQL> select ename,length(ename) from emp;
ENAME LENGTH(ENAME)
------ -------------
SMITH 5
ALLEN 5
WARD 4
JONES 5
MARTIN 6
BLAKE 5
CLARK 5
SCOTT 5
KING 4
TURNER 6
ADAMS 5
JAMES 5
FORD 4
MILLER 6
14 rows selected.
SQL> select ename,length(ename) from emp
where length(ename)=6;
ENAME LENGTH(ENAME)
-------- ------------
MARTIN 6
TURNER 6
MILLER 6
SQL> explain plan for select ename,length(ename)
from emp where length(ename)=6;
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 21 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| EMP | 3 | 21 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
--------------------------------------------------
1 - filter(LENGTH("ENAME")=6)
Note
-----
- dynamic statistics used: dynamic sampling (level=2)
17 rows selected.
![]()
SQL> create index fi_idx2 on emp(length(ename));
Index created.
SQL> select index_name,index_type,status,table_name
from user_indexes where index_name='FI_IDX2';
INDEX_NAME INDEX_TYPE STATUS TABLE_NAME
-------------------- ------------------------------ -------- -------
FI_IDX2 FUNCTION-BASED NORMAL VALID EMP
SQL> explain plan for select ename,length(ename)
from emp where length(ename)=6;
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
---------------------------------------------------------------------------------------------
Plan hash value: 729672940
-----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 60 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID BATCHED| EMP | 3 | 60 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | FI_IDX2 | 3 | | 1 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access(LENGTH("ENAME")=6)
Note
-----
- dynamic statistics used: dynamic sampling (level=2)
18 rows selected.
![]() Unique Index : To maintain data integrity by ensuring that no duplicates data in a table SQL> create table unique_tesdb(id number,name varchar2(20)); Table created. SQL> create unique index uq on unique_tesdb(id); Index created. SQL> insert into unique_tesdb values(1,'center'); 1 row created. SQL> insert into unique_tesdb values(1,'center'); insert into unique_tesdb values(1,'center') * ERROR at line 1: ORA-00001: unique constraint (SCOTT.UQ) violated SQL> select index_name,index_type,status,table_name from user_indexes where index_name='UQ'; INDEX_NAME INDEX_TYPE STATUS TABLE_NAME ----------- ---------- -------- ----------- UQ NORMAL VALID UNIQUE_TESDBComposite Index :
- A composite index is comprised of two or more columns.
- Composite indexes should be avoided as they are large
in size and can be have a performance overhead.
- A composite index contains more than one key column.
- Composite indexes can provide additional advantages over
single-column indexes
SQL> select deptno,job from emp where deptno=20 and job='CLERK';
DEPTNO JOB
---------- ---------
20 CLERK
20 CLERK
SQL> explain plan for select deptno,job from emp
where deptno=20 and job='CLERK';
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------
Plan hash value: 3956160932
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 38 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| EMP | 2 | 38 | 3 (0)| 00:00:01 |
-------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("DEPTNO"=20 AND "JOB"='CLERK')
Note :
-----
- dynamic statistics used: dynamic sampling (level=2)
17 rows selected.
![]()
SQL> create index cidx on emp (deptno,job);
Index created.
SQL> explain plan for select deptno,job from emp where deptno=20 and job='CLERK';
Explained.
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------
Plan hash value: 3105059857
-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 38 | 1 (0)| 00:00:01 |
|* 1 | INDEX RANGE SCAN| CIDX | 2 | 38 | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("DEPTNO"=20 AND "JOB"='CLERK')
Note :
- dynamic statistics used: dynamic sampling (level=2)
17 rows selected.
![]() SQL> select index_name,column_name,table_name from user_ind_columns where index_name='CIDX'; INDEX_NAME COLUMN_NAME TABLE_NAME ---------- ------------ ---------- CIDX DEPTNO EMP CIDX JOB EMP « Previous Next Topic » (Oracle Database - Partitions) |








