單一索引及複合索引的介紹
索引分為兩種,一種是單一索引,另一種是複合索引。
單一索引是指說在Table上欄位建立相對應的索引;複合索引是多個欄位建立單一索引,而這個索引的欄位順序在後面的查詢時必須遵循使用,只要查詢敘述的查詢順序與複合索引上的欄位順序不同Oracle就會捨棄該複合索引而進行全表掃描。
現在我們調整一下Where 條件式。
最普遍使用的B-Tree(也就是Index的預設值):
B-Tree是Oracle中最常見的一種索引,在Create index語法中預設就是使用這種索引類型,可是建立在單一欄位,也可以使用在多欄位上(最多允許32個欄位),搜尋的次數就跟切割出來的階層數有關:
每一個分支的的塊區間(Block)都包括了每一個分支的Block ID,並與下一層Block ID作鏈結(Chain)。左側的Block值包括索引值。ROWID。以及數據塊位置(Block address) 下一層用來連結上一層左區塊及下一層的左區塊。
B-Tree Index 在每一個TABLE的每一筆ROW裡包含了一個ROWID及索引值。
Oracle不允取在INDEX欄位的index Row中包含NULL值。如果index 為多欄位索引,且其中有某些欄位是NULL值,則這些NULL值的欄位在INDEX ROW裡存空值。
Bitmap Index(位元圖索引):
Bitmap Index通常運用在Data WhareHouse(資料倉儲)或DSS(決策支援 系統)中,提供快速查詢大量的表使用較低的成本,它可以被建立在多欄位的表格上(最多可以30個欄位,不過通常建立在少數的幾個欄位上). Bitmap Index是B-tree Index的一種應用,運用在欄位相異性較低的資料欄位上(例如性別,只有三種-男.女及不詳三種),再做資料查詢的時候,在這樣的資料性質上使用Bitmap Index速度會比B-Tree Index高。
Bitmap Index在大量資料導入時會造成效能瓶頸.當異動的資料有70%是insert時,使用B-Tree Index會比使用Bitmap Index效能上要來的好。
Hash Index(赫許索引):
使用Hash Index必須使用Hash Clusters(叢集)。當Clusters或Index Cluster建立後Clusters Key將會被定義。這個Key將會告訴Oracle在Clusters中如何儲存Table。當Data被儲存時,所有的ROW將會跟Clusters Key建立起關係並儲存在相同的Database Block。使用Hash Index時Oracle再存取資料的時候會透過Hash Function以及一個Block I/O來找到資料,就存取方式來說,這比起B-Tree Index來說I/O的比率是降低了不少,請參考下圖。
雖然Hash Index可以增加資料庫存取上的速度,但是相對的也是有一些缺點的。當建立Hash Clusters 被建立的時候必須分別賦予不同的值,這些值可以是以時間戳記為基底運算出來的一個唯一值。因為在做資料存取時是透過Hash Key進行存取,因此在儲存Hash Key的地方常常也是發生I/O競爭的地方。當進行大量資料異動時,經常會因為讀取Hash Key的衝突而將Data Overflow至Buffer中,因此會有I/O的發生。
Reverse Index(反轉索引):
反轉索引是B-tree的一種變形。當資料的range位於較大的區間時, 資料可以透過Reverse Index將資料分散放置不同的Block上有助於分散Block I/O讀取的衝突發生。
Function Index(函數索引):
你可以在你的TABLE上建立函數索引。當不使用Function Index時,只要在查詢中使用到函數,該欄位就不會使用索引來進行查詢。
函數索引使用時,須注意在擁有建立函數索引的table下進行資料異動將付出非常大的維護及運算代價。這是在考量使用Function Index前需要考慮的問題。
索引使用的抉擇:
建立索引的目的是為了在查詢時減少查詢時間以及讀取最少的Block數,但要知道維護一個索引將付出極高的代價,而如果這個索引又是複合索引時,在資料異動的同時要順便維護這個表格的索引,將會付出更高的代價.因此有些使用者很聰明的想出了使用Index enable以及Disable的方式再資料作大量異動時將索引暫時取消,並且在資料異動完畢後將索引恢復.在這一連串”停止使用”-”啟動”的動作背後,基本上是一連串的Drop Index及Create Index的指令去移除及重建索引.重建索引基本上是維護所以的動作中代價較低的一個動作(會去讀取大面積的Block數),基本上當維護索引代價高於重建索引時,我們強烈建議使用重建索引的動作來重 新建 立索引。