1. 程式人生 > >Oracle索引及使用詳解

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、針對唯一值或小範圍的資料的訪問時非常快。特別適合與精度匹配查詢與範圍查詢

2B*樹可以自動進行平衡

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)這個索引包含三個欄位

[sql]copyprint?

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'

SELECT * FROM tab1 WHERE col1='XX'

SELECT * FROM tab1 WHERE col2='XX'

SELECT * FROM tab1 WHERE col3='XX'

SELECT * FROM tab1 WHERE col1='XX' AND NAME='CCC'

SELECT * FROM tab1 WHERE col2='XX' AND NAME='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;