原文地址http://www.cnblogs.com/djcsch2001/articles/1823459.html
一、簡介
索引是關系數據庫中用於存放每一條記錄的一種對象,主要目的是加快數據的讀取速度和完整性檢查。建立索引是一項技術性要求高的工作。一般在數據庫設計階段的與數據庫結構一道考慮。應用系統的性能直接與索引的合理直接有關。
二、 語法
2.1 創建索引
CREATE INDEX
CREATE [unique] INDEX [user.]index
ON [user.]table (column [ASC | DESC] [,column [ASC | DESC] ] ... ) [CLUSTER [scheam.]cluster] [INITRANS n]
[MAXTRANS n]
[PCTFREE n]
[STORAGE storage]
[TABLESPACE tablespace]
[NO SORT]
其中: schema ORACLE模式,缺省即為當前帳戶 index 索引名 table 創建索引的基表名 column 基表中的列名,一個索引最多有16列,long列、long raw 列不能建索引列 DESC、ASC 缺省為ASC即升序排序 CLUSTER 指定一個聚簇(Hash cluster不能建索引) INITRANS、MAXTRANS 指定初始和最大事務入口數 Tablespace 表空間名 STORAGE 存儲參數,同create table 中的storage. PCTFREE 索引數據塊空閑空間的百分比(不能指定pctused) NOSORT 不(能)排序(存儲時就已按升序,所以指出不再排序)
2.1修改索引
對於較早的Oracle版本,修改索引的主要任務是修改已存在索引的存儲參數適應增長的需要或者重新建立索引。而Oracle8I及以后的版本,可以對無用的空間進行合並。這些的工作主要是由管理員來完成。
ALTER [UNIQUE] INDEX [user.]index
[INITRANS n]
[MAXTRANS n] REBUILD [STORAGE n]
其中:
REBUILD 是 根據原來的索引結構重新建立索引,實際是刪除原來的索引后再重新建立。
提示:DBA經常用 REBUILD 來重建索引可以減少硬盤碎片和提高應用系統的性能。
2.3 刪除索引
DROP INDEX [schema.]indexname
三、各類索引介紹
3.1 基於函數的索引
基於函數的索引就是存儲預先計算好的函數或表達式值的索引。這些表達式可以是算術運算表達式、SQL或PL/SQL函數、C調用等。值得注意的是,一般用戶要創建函數索引,必須具有GLOBAL QUERY REWRITE和CREATE ANY INDEX權限。否則不能創建函數索引。
示例:
為EMP表的ename 列建立大寫轉換函數的索引idx :
CREATE INDEX idx ON emp ( UPPER(ename));
這樣就可以在查詢語句來使用:
SELECT * FROM EMP WHERE UPPER(ename) LIKE ‘JOH%’;
3.2 反向鍵索引
反向鍵索引通過反向鍵保持索引的所有葉子鍵上的插入分布。有時,可用反向鍵索引來避免不平衡的索引。對於反向鍵索引可以進行下面操作:
1. 通過在ALTER INDEX命令后加REBUILD NOREVERSE或REBUILD REVERSE子句來使索引邊為反向鍵索引或普通索引;
2. 采用范圍掃描的查詢不能使用反向鍵索引;
3. 位圖索引不能反向;
4. 索引編排表不能反向。
示例1:創建一個反向鍵索引
CREATE INDEX i ON t (a,b,c) REVERSE;
示例2:使一個索引變為反向鍵索引
ALTER INDEX i REBUILD NOREVERSE
3.3 索引組織表
與普通的索引不一樣,索引組織表(Index_Organized Table)是根據表來存儲數據,即將索引和表存儲在一起。這樣的索引結構表(Index_organized table—IOT)的特點是:對表數據的改變,如插入一新行、刪除某行都引起索引的更新。
索引組織表就象帶一個或多個列所有的普通表一樣,但索引組織表在B-樹索引結構的葉節點上存儲行數據。通過在索引結構中存儲數據,索引組織表減少了總的存儲量,此外,索引組織表也改善訪問性能。
由於表中的行與B_樹索引存放在一起,每個行都沒有ROWID,而是用主鍵來標識。但是Oracle會“猜”這些行的位置並為每個行分配邏輯的ROWID。此外,你可以為這樣的表建立第二個索引。
創建索引結構表也是用CREATE TABLE 命令加ORGANIZATION INDEX關鍵字來實現。但是,這樣的表在創建完后,你還必須為該表建立一個主鍵。
例子:
CREATE TABLE IOT_EXPAMPLE ( Pk_col1 number(4), Pk_col2 varchar2(10), Non_pk_col1 varchar2(40), Non_pk_col2 date, CONSTRAINT pk_iot PRIMARY KEY( pk_col1, pk_col2) ) ORGANIZATION INDEX TABLESPACE INDEX STORAGE( INITIAL 1M NEXT 512K PCTINCREASE 0 );
索引組織表有些限制:
- 不能使用唯一約束;
- 必須具有一個主鍵;
- 不能建立簇;
- 不能包含LONG類型列;
- 不支持分布和復制。
提示:如果建立了索引組織表,則會在DBA_TABLES中的IOT_TYPE和IOT_NAME列上記錄有索引組織表的信息。
四、總結
適當的使用索引可以提高數據檢索速度,可以給經常需要進行查詢的字段創建索引。
oracle的索引分為5種:唯一索引,組合索引,反向鍵索引,位圖索引,基於函數的索引
創建索引的標准語法:
CREATE INDEX 索引名 ON 表名 (列名)
TABLESPACE 表空間名;
創建唯一索引:
CREATE unique INDEX 索引名 ON 表名 (列名)
TABLESPACE 表空間名;
創建組合索引:
CREATE INDEX 索引名 ON 表名 (列名1,列名2)
TABLESPACE 表空間名;
創建反向鍵索引:
CREATE INDEX 索引名 ON 表名 (列名) reverse
TABLESPACE 表空間名;
“TABLESPACE 表空間名” 可以省略