Oracle索引及使用詳解
一、索引的分類
序號 |
索引名稱 |
中文含義 |
1 |
B*索引 |
最經典、最常用的索引 |
2 |
Primary Key |
主鍵、也是也是一種索引 |
3 |
Unique Key |
唯一索引 |
4 |
Function-Based Index |
函式索引 |
5 |
Composite Index |
多欄位複合索引 |
6 |
Reverse Index |
反轉索引 |
7 |
Bitmap Index |
點陣圖索引 |
8 |
Cluster Index |
聚簇索引 |
9 |
Cluster-Hash Index |
簇雜湊索引 |
10 |
Local Prefix Partitioned Index |
本地字首分割槽索引 |
11 |
Local non-Prefix Partitioned Index |
本地非字首分割槽索引 |
12 |
Global Range-Partitioned Index |
全域性範圍分割槽索引 |
13 |
Global Hash-Partitioned Index |
全域性雜湊分割槽索引 |
14 |
Context Index |
全文搜尋索引 |
15 |
CTXCA Index |
文獻目錄索引 |
16 |
CTXRULE Index |
文獻分類索引 |
17 |
CTXXPASTH Index |
XML型別的全文索引 |
18 |
Bitmap-join Index |
點陣圖連線索引 |
19 |
………… |
………… |
雖然Oracle提供瞭如此多的索引,但是在實際中常用的索引型別也就那麼幾種
OLTP——聯機事務處理,可以簡單認為是我們的業務系統,有大量DML操作
OLAP——聯機事務分析處理,可以簡單認為是資料倉庫,基本上都是查詢操作
二、B*樹索引(用於OLTP)
B樹索引是Oracle預設索引型別,也是最常用的索引,該類索引有許多好處:
1、針對唯一值或小範圍的資料的訪問時非常快。特別適合與精度匹配查詢與範圍查詢
2、B*樹可以自動進行平衡
3、雖然過多的B樹索引會影響DML操作,但是單個B*樹索引對DML操作的影響是很小的
4、大多數情況下,B*樹索引可以隨著資料量的增長而很好的進行擴充套件
B*樹單欄位索引使用建議
1、分析SQL語句中約束條件的欄位
2、如果條件欄位不固定,可以針對單欄位建立普通B*樹索引
3、針對可選性高的欄位建立索引
4、如果是多表連線,可以考慮在被驅動表上的連線欄位加索引
5、通過對SQL語句進行分析,檢視執行計劃來進行優化
三、點陣圖索引(用於OLAP)
點陣圖索引是用來改善基於有很少列值的行的訪問速度,例如中國有十幾億人口,那麼民族至於56個,那麼針對民族程式碼就可以建立點陣圖索引;
在OLTP中一般不使用點陣圖索引
四、函式索引
如下情況:WHERE 1=1 AND (sysdate-to_date(DT_TIME,'yyyymmddhh24miss'))*24*60<10
在DT_TIME上面加上了索引,但是發現執行計劃並沒有按照索引來,這裡其實是Oracle的一個缺陷了,
例如:DT_TIME-7與 DT_TIME在我們看來是一樣的,但是在Oracle眼裡卻是不一樣的,前面的表示式不會走索引,而後面的表示式就會走索引
針對上述情況,如果索引欄位在函式裡面,要麼簡歷函式索引,要麼就優化表示式。但是建立函式索引有一些限制
函式索引限制:
1、必須使用一個確定的函式定義基於該函式的索引,也就是說函式僅返回一個值
2、必須使用返回可重複值的函式來定義基於該函式的索引,如sysdate就不行
3、可以對基於函式的索引進行分割槽,但是對基於函式的全域性分割槽索引來說,分割槽鍵不能是索引所基於的函式
4、函式必須使用圓括號來定義,即使沒有引數
5、索引基於的函式不能包含聚合函式
使用建議:
1、不要輕易在欄位前面加函式
2、儘量不要將欄位嵌入表示式中
3、儘量減少使用函式索引,能不用就不用,因為函式索引的維護代價比普通索引高;函式索引計算值可能大於原欄位值,將消耗更多的儲存空間
五、複合索引
在大多數情況下,複合索引比單欄位索引號,因為可以過濾出更多資料,精確定位。但是要考慮實際情況,不能濫用,不能亂用。
複合索引設計原則:
1、字首性
也就是說到底把那個欄位放在第一個未知呢,這個至關重要
例如:(col1,col2,col3)這個索引包含三個欄位
1.SELECT * FROM tab1 WHERE col1='XX'
2.SELECT * FROM tab1 WHERE col2='XX'
3.SELECT * FROM tab1 WHERE col3='XX'
4.SELECT * FROM tab1 WHERE col1='XX'ANDNAME='CCC'
5.SELECT * FROM tab1 WHERE col2='XX'ANDNAME='CCC'
針對上面的幾個SQL語句,到底誰會走索引,誰不走索引你。
其實只要含有col1='SSSS'條件的語句都會走索引
這就是為什麼第一個欄位為什麼這麼重要的原因了
2、可選性
就是用於索引的欄位的非重複資料必須多,像用性別來做索引欄位就行不通。
將欄位可選性越多的欄位放到前面
複合索引使用建議:
1、分析SQL語句中約束條件欄位
2、約束條件比較固定的,優先採用B*樹複合索引
3、單個欄位是主鍵、唯一鍵或則其他可選性很高的欄位可以建立單欄位索引,節省索引開銷
4、在建立複合索引的時候,優先考慮其字首性,其次是可選性
5、如果涉及到幾個條件使用頻繁,但是查詢組合不固定,可以分別建立單欄位索引
6、如果是多表連線,可以考慮在被驅動表的連線欄位與該表的其他欄位建立複合索引
7、通過檢視SQL語句執行計劃進行分析
六、索引維護
1、索引並不是越多越好,因為索引會影響DML操作並且本身也會消耗儲存,因此刪掉沒有使用的索引
2、索引碎片整理,可以定期重建壓縮索引
alter index ix_name rebuild;
alter index ix_name coalesce;