降序索引
降序索引是i裡面新出現的一種索引是B*Tree的另一個衍生物它的變化就是列在索引中的儲存方式從升序變成了降序在某些場合下降序索引將會起作用舉個例子我們來查詢一張表並進行排序
SQL> select * from test where a between and order by a descb asc;
已選擇行
Execution Plan
SELECT STATEMENT Optimizer=CHOOSE (Cost= Card= Bytes=)
SORT(ORDER BY)(Cost= Card= Bytes=)
INDEX (RANGE SCAN) OF IND_BT (NONUNIQUE) (Cost= Card= Bytes=)
這裡優化器首先選擇了一個索引范圍掃描然後還有一個排序的步驟如果使用了降序索引排序的過程會被取消
SQL> create index testind_desc on testtestrev(a descb asc);
索引已創建
SQL> analyze index testind_desc compute statistics;
索引已分析
再來看下執行路徑
SQL> select * from test where a between and order by a descb asc;
已選擇行
Execution Plan(SQL執行計劃稍後會講解如何使用)
SELECT STATEMENT Optimizer=CHOOSE (Cost= Card= Bytes=)
INDEX (RANGE SCAN) OF IND_DESC (NONUNIQUE) (Cost= Card= Bytes=)
我們看到排序過程消失了這是因為創建降序索引時Oracle已經把數據都按降序排好了
另外一個需要注意的地方是要設置initora裡面的compatible參數為或以上否則創建時desc關鍵字將被忽略
位圖索引
位圖索引主要用於決策支持系統或靜態數據不支持行級鎖定位圖索引最好用於低cardinality列(即列的唯一值除以行數為一個很小的值接近零)例如又一個性別列列值有MaleFemaleNull等種但一共有萬條記錄那麼/約等於這種情況下最適合用位圖索引
位圖索引可以是簡單的(單列)也可以是連接的(多列)但在實踐中絕大多數是簡單的在這些列上多位圖索引可以與AND或OR操作符結合使用位圖索引使用位圖作為鍵值對於表中的每一數據行位圖包含了TRUE()FALSE()或NULL值位圖索引的位圖存放在BTree結構的頁節點中BTree結構使查找位圖非常方便和快速另外位圖以一種壓縮格式存放因此占用的磁盤空間比BTree索引要小得多位圖索引的格式如表所示
表 位圖索引的格式
行
值
Male
Female
Null
如果搜索where gender=Male要統計性別是Male的列行數的話Oracle很快就能從位圖中找到共行即第行是符合條件的如果要搜索where gender=Male or gender=Female的列的行數的話也很容易從位圖中找到共行即行是符合條件的如果要搜索表的值的話那麼Oracle會用內部的轉換函數將位圖中的相關信息轉換成rowid來訪問數據塊
From:http://tw.wingwit.com/Article/program/Oracle/201311/18696.html