Oracle索引的建立、修改、刪除
一、概念和作用
在oracle索引是一種供伺服器在表中快速查詢一個行的資料庫結構。合理使用索引能夠大大提高資料庫的執行效率。
在資料庫中建立索引主要有以下作用。
(1)快速存取資料。
(2)既可以改善資料庫效能,又可以保證列值的唯一性。
(3)實現表與表之間的參照完整性
(4)在使用orderby、groupby子句進行資料檢索時,利用索引可以減少排序和分組的時間。
二、為什麼能夠提高查詢速度
索引就是通過事先排好序,從而在查詢時可以應用二分查詢等高效率的演算法。
一般的順序查詢,複雜度為O(n),而二分查詢複雜度為O(log2n)。當n很大時,二者的效率相差及其懸殊。
三、建立索引
目的:提高對錶的查詢速度;對錶有關列的取值進行檢查。
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]
Advanced
例如:
create index big_index on big_data_tbl(id);
其中:
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:不(能)排序(儲存時就已按升序,所以指出不再排序)
注意:
- 一個基表不能建太多的索引;
- 空值不能被索引;
- 只有唯一索引才真正提高速度,一般的索引只能提高30%左右。
四、修改索引
修改索引的主要任務是修改已存在索引的儲存引數適應增長的需要或者重新建立索引。
ALTER [UNIQUE] INDEX [user.]index
[INITRANS n]
[MAXTRANS n]
REBUILD
[STORAGE n]
其中:
REBUILD是根據原來的索引結構重新建立索引,實際是刪除原來的索引後再重新建立。
提示:
DBA經常用REBUILD來重建索引可以減少硬碟碎片和提高應用系統的效能。
五、刪除索引
當不需要時可以將索引刪除以釋放出硬碟空間。命令如下:
DROP INDEX [schema.]indexname
注:當表結構被刪除時,有其相關的所有索引也隨之被刪除。
六、索引建立原則總結
1、如果有兩個或者以上的索引,其中有一個唯一性索引,而其他是非唯一,這種情況下oracle將使用唯一性索引而完全忽略非唯一性索引。
2、至少要包含組合索引的第一列(即如果索引建立在多個列上,只有它的第一個列被where子句引用時,優化器才會使用該索引)。
3、小表不要建立索引。
4、對於基數大的列適合建立B樹索引,對於基數小的列適合簡歷點陣圖索引。
5、列中有很多空值,但經常查詢該列上非空記錄時應該建立索引。
6、經常進行連線查詢的列應該建立索引。
7、使用create index時要將最常查詢的列放在最前面。
8、LONG(可變長字串資料,最長2G)和LONG RAW(可變長二進位制資料,最長2G)列不能建立索引。
9、限制表中索引的數量(建立索引耗費時間,並且隨資料量的增大而增大;索引會佔用物理空間;當對錶中的資料進行增加、刪除和修改的時候,索引也要動態的維護,降低了資料的維護速度)。