b+ and bitmap index

dotaddjj發表於2011-09-30

索引是最佳化查詢的一個很重要但是又很複雜的技術手段。有時候提到查詢更多的網友都是create 索引,但是索引的建立和sql最佳化器以及具體業務情況都是很有關係的。以及具體索引的類別,具體是b+樹索引還是bitmap索引。

建立一個預設b+樹單列索引

Create index index_test01 on test01(id);

Create預設的b+樹基於函式的索引

Create index index_fun_test05 on test05(substr(id,1,1)

建立一個基於函式的索引,在9.2.0.3之前query_rewrite_enabled引數必須為true,基於函式的索引才能生效,後續版本中基於函式的索引跟此引數已經無關,其中基於函式的索引是先計算該函式或表示式的值然後儲存與索引中。

當然還可以建立多列索引。

Create index index_test01 on test01(id,name)

B+樹索引:

B+樹索引都是樹狀結構,b+樹索引通常是指為索引每個關鍵字儲存一個rowid列表的索引。

索引的最上層是根,然後下一級別是分支塊,最底層是葉,關鍵字掃描索引既可以升序也可以降序。

索引的入口:入口頭(包含欄位編號和鎖資訊);關鍵欄位長度和值 rowidrowid是限制性rowid,由於儲存在同一索引段內)

如果關鍵欄位為null,該列不會儲存在索引中,所以where中使用null會導致全表掃描。

對錶dml操作時,oracle還需要對其關鍵字的索引進行維護,在dml時可以把索引drop或者無效,然後再重建索引加快dml操作。

Dml和索引:

Insert資料行導致在適當的塊中插入,delete僅僅導致刪除,update索引欄位會導致索引的刪除和插入。

rebuild index:

由於對錶的dml操作會在索引列上進行相應的更新。例如對錶的delete,刪除索引中的記錄,但是該記錄索引項的使用空間不能被重新使用,因此索引空間會不斷增加,只是因為索引中無效空間會增加。當然需要管理員定期的對頻繁使用的table做alter index rebuild,這樣也可以適當的提高使用該索引的查詢的效率。

B+樹索引的索引值中包含rowidoracle可以在行級別上鎖定索引。但是由於每一資料行索引就會儲存在索引段資料塊中,bitmap對於相同的關鍵字只儲存與單一資料塊中,所以b+樹索引需要索引段的更多的資料塊。

有兩種型別的索引塊: (這個是b+樹的索引的結構)
1、用於搜尋的分支塊(branch block)
2、用於儲存索引資料的葉塊(leaf block)

分支塊中儲存以下資訊:(關於分支快中儲存的資訊需要理解
1、最小的鍵值字首,用於在(本塊的)兩個鍵值之間做出分支選擇。
2、指向包含所查詢鍵值的子塊的指標。

包含 n 個鍵值的分支塊含有 n+1 個指標。鍵值及指標的數量同時還受索引塊容量的限制。

所有葉塊相對於其根分支塊的深度是相同的。

葉塊用於儲存以下資訊:(這也是葉塊用於索引檢索的關鍵)
1、資料行的鍵值(key value) 。
2、鍵值對應資料行的 ROWID 。

點陣圖索引:

點陣圖索引被儲存為壓縮的索引值,點陣圖索引結構和b+樹索引相同,但是葉節點儲存的關鍵字值的點陣圖而不是rowid,其中包含一個範圍內的rowid,b+樹索引的葉子節點對應一個rowid,利用點陣圖向量計數。

葉節點:入口頭 關鍵字值 起始rowid 結束rowid 點陣圖段,其中oracle使用一種專利壓縮技術儲存點陣圖段。

點陣圖索引和b+樹索引:

1 b+樹索引適合高候選欄位,bitmap索引適合低候選欄位

2 b+樹索引關鍵字的更新代價相對較小,bitmap索引關鍵欄位更新代價高

3 b+樹使用or謂詞查詢效率低,bitmap索引使用or謂詞查詢效率高

4 b+樹多適用於OLTPbitmap適用與OLAPOLAP事務處理,多為即時處理,OLAP資料倉儲需要高階管理進行資料分析。

點陣圖索引更新關鍵字代價較大,是由於點陣圖使用點陣圖段級鎖,而在b+樹索引,鎖載入入口對應表中一行。

點陣圖索引可以用於類似點陣圖操作,oracle可以使用兩個點陣圖位和操作,得到一個結果點陣圖,這樣使用or可以高效利用點陣圖索引。

自動段空間管理中,段的pctfree引數用於存放後續的insert空間,pctused已經不起作用了,同樣也使用與索引段中。

Create_bitmap_area_size引數

點陣圖索引的初始化引數create_bitmap_area_size決定了記憶體中用來儲存點陣圖段的空間數量,預設值是8M,較大的數值可能會加快點陣圖索引的建立速度。

重建索引:使用已經存在的索引重建索引時,不需要排序,當然建立速度比drop然後create快多了,重建的索引不包含任何刪除的入口,因此索引的利用率更高。當然重構索引不能把b_tree樹索引轉換為bitmap索引,反之亦然。

合併索引:索引的合併是聯機資料塊的重構

Alter index index_test02 coalesce

分析索引的有效性:

Analyze index index_test02 validate structure

分析索引後查詢index_status檢視。

Alter index index_test02 minitoring usage

檢測索引的使用,從oracle 9I後查詢v$object_usage中收集有關索引的使用情況,monitioring usage後就會重置檢視資訊

Truncate和索引:

Truncate表時不僅表段會重建新建,索引段也會釋放空間重建。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1055409/,如需轉載,請註明出處,否則將追究法律責任。

相關文章