各種索引的結(jié)構(gòu)分析 降序索引和位圖索引
2024-07-21 02:33:44
供稿:網(wǎng)友
降序索引 降序索引是8i里面新出現(xiàn)的一種索引,是B*Tree的另一個(gè)衍生物,它的變化就是列在索引中的儲(chǔ)存方式從升序變成了降序,在某些場合下降序索引將會(huì)起作用。舉個(gè)例子,我們來查詢一張表并進(jìn)行排序: SQL> select * from test where a between 1 and 100 order by a desc,b asc; 已選擇100行。Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=100 Bytes=400)
1 0 SORT(ORDER BY)(Cost=2 Card=100 Bytes=400)
2 1 INDEX (RANGE SCAN) OF 'IND_BT' (NON-UNIQUE) (Cost=2 Card=100 Bytes=400) 這里優(yōu)化器首先選擇了一個(gè)索引范圍掃描,然后還有一個(gè)排序的步驟。假如使用了降序索引,排序的過程會(huì)被取消。SQL> create index test.ind_desc on test.testrev(a desc,b asc); 索引已創(chuàng)建。SQL> analyze index test.ind_desc compute statistics; 索引已分析 再來看下執(zhí)行路徑:SQL> select * from test where a between 1 and 100 order by a desc,b asc; 已選擇100行。Execution Plan(SQL執(zhí)行計(jì)劃,稍后會(huì)講解如何使用)。
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=100 Bytes=400)1 0 INDEX (RANGE SCAN) OF 'IND_DESC' (NON-UNIQUE) (Cost=2 Card=100 Bytes=400) 我們看到排序過程消失了,這是因?yàn)閯?chuàng)建降序索引時(shí)Oracle已經(jīng)把數(shù)據(jù)都按降序排好了。 另外一個(gè)需要注重的地方是要設(shè)置init.ora里面的compatible參數(shù)為8.1.0或以上,否則創(chuàng)建時(shí)desc要害字將被忽略。 位圖索引 位圖索引主要用于決策支持系統(tǒng)或靜態(tài)數(shù)據(jù),不支持行級(jí)鎖定。位圖索引最好用于低cardinality列(即列的唯一值除以行數(shù)為一個(gè)很小的值,接近零),例如又一個(gè)“性別”列,列值有“Male”,“Female”,“Null”等3種,但一共有300萬條記錄,那么3/3000000約等于0,這種情況下最適合用位圖索引。 位圖索引可以是簡單的(單列)也可以是連接的(多列),但在實(shí)踐中絕大多數(shù)是簡單的。在這些列上多位圖索引可以與AND或OR操作符結(jié)合使用。位圖索引使用位圖作為鍵值,對(duì)于表中的每一數(shù)據(jù)行位圖包含了TRUE(1)、FALSE(0)、或NULL值。位圖索引的位圖存放在B-Tree結(jié)構(gòu)的頁節(jié)點(diǎn)中。B-Tree結(jié)構(gòu)使查找位圖非常方便和快速。另外,位圖以一種壓縮格式存放,因此占用的磁盤空間比B-Tree索引要小得多。位圖索引的格式如表26-1所示。 表26-1 位圖索引的格式
行
值 1 2 3 4 5 6 7 8 9 10
Male 1 0 0 0 0 0 0 0 1 1
Female 0 1 1 1 0 0 1 1 0 0
Null 0 0 0 0 1 1 0 0 0 0 假如搜索where gender=’Male’,要統(tǒng)計(jì)性別是”Male”的列行數(shù)的話,Oracle很快就能從位圖中找到共3行即第1,9,10行是符合條件的;假如要搜索where gender=’Male’ or gender=’Female’的列的行數(shù)的話,也很輕易從位圖中找到共8行即1,2,3,4,7,8,9,10行是符合條件的。假如要搜索表的值的話,那么Oracle會(huì)用內(nèi)部的轉(zhuǎn)換函數(shù)將位圖中的相關(guān)信息轉(zhuǎn)換成rowid來訪問數(shù)據(jù)塊。