1. 程式人生 > >Oracle 索 引 的 分 類 :降序索引和點陣圖索引

Oracle 索 引 的 分 類 :降序索引和點陣圖索引

 降序索引

    降序索引是8i裡面新出現的一種索引,是B*Tree的另一個衍生物,它的變化就是列在索引中的儲存方式從升序變成了降序,在某些場合下降序索引將會起作用。舉個例子,我們來查詢一張表並進行排序:

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)

    這裡優化器首先選擇了一個索引範圍掃描,然後還有一個排序的步驟。如果使用了降序索引,排序的過程會被取消。

SQL> create index test.ind_desc on test.testrev(a desc,b asc);

    索引已建立。

SQL> analyze index test.ind_desc compute statistics;

    索引已分析

    再來看下執行路徑:

SQL> select * from test where a between 1 and 100 order by a desc,b asc;

    已選擇100行。

Execution Plan(SQL執行計劃,稍後會講解如何使用)。
----------------------------------------------------------
   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)

    我們看到排序過程消失了,這是因為建立降序索引時Oracle已經把資料都按降序排好了。

    另外一個需要注意的地方是要設定init.ora裡面的compatible引數為8.1.0或以上,否則建立時desc關鍵字將被忽略。

    點陣圖索引

    點陣圖索引主要用於決策支援系統或靜態資料,不支援行級鎖定。點陣圖索引最好用於低cardinality列(即列的唯一值除以行數為一個很小的值,接近零),例如又一個“性別”列,列值有“Male”,“Female”,“Null”等3種,但一共有300萬條記錄,那麼3/3000000約等於0,這種情況下最適合用點陣圖索引。

    點陣圖索引可以是簡單的(單列)也可以是連線的(多列),但在實踐中絕大多數是簡單的。在這些列上多點陣圖索引可以與AND或OR操作符結合使用。點陣圖索引使用點陣圖作為鍵值,對於表中的每一資料行點陣圖包含了TRUE(1)、FALSE(0)、或NULL值。點陣圖索引的點陣圖存放在B-Tree結構的頁節點中。B-Tree結構使查詢點陣圖非常方便和快速。另外,點陣圖以一種壓縮格式存放,因此佔用的磁碟空間比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’,要統計性別是”Male”的列行數的話,Oracle很快就能從點陣圖中找到共3行即第1,9,10行是符合條件的;如果要搜尋where gender=’Male’ or gender=’Female’的列的行數的話,也很容易從點陣圖中找到共8行即1,2,3,4,7,8,9,10行是符合條件的。如果要搜尋表的值的話,那麼Oracle會用內部的轉換函式將點陣圖中的相關資訊轉換成rowid來訪問資料塊。

 

相關推薦

Oracle 索引點陣索引

 降序索引     降序索引是8i裡面新出現的一種索引,是B*Tree的另一個衍生物,它的變化就是列在索引中的儲存方式從升序變成了降序,在某些場合下降序索引將會起作用。舉個例子,我們來查詢一張表並進行排序: SQL> select * from test where a

Oracle B樹索引點陣索引索引的說明目的、索引碎片問題

B樹索引和點陣圖索引 索引是資料庫為了提高查詢效率提供的一種冗餘結構,保守計算資料庫50%以上的調優可以通過調整索引來進行優化; 引用國內一位資深的ORACLE專家的話:"我其實只懂點(挨踢)知識,IT裡面其實只懂點甲骨文,甲骨文裡面其實只懂點資料庫,資料庫裡面其實只懂點SQL,SQL裡面其實

[Oracle]B-樹索引點陣索引

11.3 B-樹索引 索引的頂端是根結點,這一結點中包含的是存有指向索引中下一級指標的項。接下來是分枝結點(塊),分枝結點中的記錄(項)存的是指向下一級(塊)的指標。最底層為葉子結點。在葉子結點存有指向表中資料行的索引項。葉子結點被雙向連結串列鏈在一起以方便按索引關鍵字的升序

Oracle 使用特殊索引的注意事項

 在ORACLE裡除了我們常用的B樹索引外,還有一些特殊索引能被使用。      如:倒序索引,位對映索引,函式索引等。      我根據自己的體會,列一個注意事項:      倒序索引:      ORACLE DOC上說倒序索引比較適合於序列號產生的欄位,如唯一編號。  

深入理解Oracle表(5)三大表連線方式詳解之Hash Join的定義,原理,演算法,成本,模式點陣

 Hash Join只能用於相等連線,且只能在CBO優化器模式下。相對於nested loop join,hash join更適合處理大型結果集        Hash Join的執行計劃第1個是hash表(build table),第2個探查表(probe table),

oracle使用索引不使用索引效能分析

首先準備一張百萬條資料的表,這樣分析資料差距更形象! 下面用分頁表資料對錶進行分析,根據EMP_ID 欄位排序,使用索引和不使用索引效能差距! sql查詢語法準備,具體業務根據具體表書寫sql語法: SELECT * FROM (SELECT ROW_.*, ROWNUM ROWNUM_

分享 資料視覺化資訊成功的要素

如果僅僅是能夠將資料轉化成漂亮的圖表,或者是設計出20種不同式樣的圖表來解釋你的觀點,並不說明你

點陣索引bitmap(二)現代點陣索引技術

由點陣圖索引bitmap(一):基本概念可知,傳統點陣圖索引技術最大的侷限性主要表現在,高基數列的索引尺寸過大從而影響查詢效能。所以,從控制索引大小和減少查詢響應時間這兩個出發點,業內的優化策略一般從以下三個角度切入:分桶(binning)、編碼(encodin

python小練習給定一個非空且為正整數的列表 按重復次數 排列輸出

class 數字 轉換成 原來 小練習 顯示 python index 去重 假設有個列表 a=[1,1,1,2,2,4,5,5,5,5] (非空且為正整數) 那麽根據要求 最終輸出的形式為 5,1,2,4 (按重復次數 降序排列輸出) 代碼實現及解釋: a=[1

引擎系列四Lucene提供的詞器、IKAnalyze中文詞器集成

author oid core 長度 maven項目 int get attribute clu 一、Lucene提供的分詞器StandardAnalyzer和SmartChineseAnalyzer 1.新建一個測試Lucene提供的分詞器的maven項目LuceneAn

引擎系列八solr-部署詳解(solr兩種部署模式介紹、獨立服務器模式詳解、SolrCloud布式集群模式詳解)

nod 為什麽 用途 serve creat 復制 stand 數據 變量名 一、solr兩種部署模式介紹 Standalone Server 獨立服務器模式:適用於數據規模不大的場景 SolrCloud 分布式集群模式:適用於數據規模大,高可靠、高可用、高並發的場景 二

oracle,mysql,sqlserver頁查詢,附實體

 最近簡單的對oracle,mysql,sqlserver2005的資料分頁查        (一)、 mysql的分頁查詢       &n

pythonYY校招試題--傳入一個數組進行排序,奇數在前進行升序,偶數在後進行

a = input() # 輸入使用空格進行進行間隔 num = [int(n) for n in a.split()] print(num) def mysort(a,ascending=True): # 插入排序,a為list陣列,ascending=True時升

sklearn庫分類、迴歸、聚維、模型優化、文字預處理實現用例(趕緊收藏)

分類演算法 # knn演算法 from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier() ''' __init__函式 def __init__(self, n_neighbors=5,

oracle order by 排序之 null 排最後

1 表資料person_info id   name  age 1    qq       23 2    ee  &

Oracle之按工資查出表中第5到第10條的記錄的方法

1.找出emp表中第5到10條記錄並按降序排列 1.1   SELECT * FROM emp ORDER BY sal DESC; //查出表中所有資料並按降序排列 1.2   SELECT ROWNUM r,s.* FROM (SELECT * FROM emp OR

List根據實體的某個屬性升序或者來排列

介紹 最近做的一個前臺的頁面的獲曲資料庫某個表的列表的功能,要求按照表的某個屬性來升序最好不要動mybatis,所以通過mybatis獲取的list,通過方法的 Collections.sort(list, new Comparator() {…});進行排序 升序 / 降序 i

Java程式碼陣列選擇排序 (升序

public class test9 {public static void main(String[] args){int []a={12,2,45,65,99,3,21};System.out.println("原陣列為:"+"\n"+a[0]+"\t"+a[1]+"\t

Oracle 索引

降序索引     降序索引是8i裡面新出現的一種索引,是B*Tree的另一個衍生物,它的變化就是列在索引中的儲存方式從升序變成了降序,在某些場合下降序索引將會起作用。舉個例子,我們來查詢一張表並進行排序: SQL> select * from test where a