各種索引的創建方法

2.4 位圖索引

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

    位圖索引可以是簡單的(單列)也可以是連接的(多列),但在實踐中絕大多數是簡單的。在這些列上多位圖索引可以與AND或OR操作符結合使用。位圖索引使用位圖作爲鍵值,對於表中的每一數據行位圖包含了TRUE(1)、FALSE(0)、或NULL值。位圖索引的位圖存放在B-Tree結構的頁節點中。B-Tree結構使查找位圖非常方便和快速。另外,位圖以一種壓縮格式存放,因此佔用的磁盤空間比B-Tree索引要小得多。

    如果搜索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來訪問數據塊。

    2.5 函數索引

    基於函數的索引也是8i以來的新產物,它有索引計算列的能力,它易於使用並且提供計算好的值,在不修改應用程序的邏輯上提高了查詢性能。使用基於函數的索引有幾個先決條件:

    (1)必須擁有QUERY REWRITE(本模式下)或GLOBAL QUERY REWRITE(其他模式下)權限。
    (2)必須使用基於成本的優化器,基於規則的優化器將被忽略。
    (3)必須設置以下兩個系統參數:

    QUERY_REWRITE_ENABLED=TRUE
    QUERY_REWRITE_INTEGRITY=TRUSTED

    可以通過alter system set,alter session set在系統級或線程級設置,也可以通過在init.ora添加實現。這裏舉一個基於函數的索引的例子:

SQL> create index test.ind_fun on test.testindex(upper(a)); 索引已創建。 SQL> insert into testindex values('a',2); 已創建 1 行。 SQL> commit; 提交完成。 SQL> select /*+ RULE*/* FROM test.testindex where upper(a)='A'; A B -- ---------- a 2 Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=HINT: RULE 1 0 TABLE ACCESS (FULL) OF 'TESTINDEX' (優化器選擇了全表掃描) -------------------------------------------------------------------- SQL> select * FROM test.testindex where upper(a)='A'; A B -- ---------- a 2 Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=5) 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TESTINDEX' (Cost=2 Card= 1 Bytes=5) 2 1 INDEX (RANGE SCAN) OF 'IND_FUN' (NON-UNIQUE) (Cost=1 Car d=1)(使用了ind_fun索引)

     3 各種索引的創建方法

    (1)*Tree索引。
    Create index indexname on tablename(columnname[columnname...])
    (2)反向索引。
    Create index indexname on tablename(columnname[columnname...]) reverse
    (3)降序索引。
    Create index indexname on tablename(columnname DESC[columnname...])
    (4)位圖索引。
    Create BITMAP index indexname on tablename(columnname[columnname...])
    (5)函數索引。
    Create index indexname on tablename(functionname(columnname))
    注意:創建索引後分析要索引才能起作用。
    analyze index indexname compute statistics;

    4 各種索引使用場合及建議(1)B*Tree索引。

    常規索引,多用於oltp系統,快速定位行,應建立於高cardinality列(即列的唯一值除以行數爲一個很大的值,存在很少的相同值)。
    (2)反向索引。
    B*Tree的衍生產物,應用於特殊場合,在ops環境加序列增加的列上建立,不適合做區域掃描。
    (3)降序索引。
    B*Tree的衍生產物,應用於有降序排列的搜索語句中,索引中儲存了降序排列的索引碼,提供了快速的降序搜索。
    (4)位圖索引。
    位圖方式管理的索引,適用於OLAP(在線分析)和DSS(決策處理)系統,應建立於低cardinality列,適合集中讀取,不適合插入和修改,提供比B*Tree索引更節省的空間。
    (5)函數索引。
    B*Tree的衍生產物,應用於查詢語句條件列上包含函數的情況,索引中儲存了經過函數計算的索引碼值。可以在不修改應用程序的基礎上能提高查詢效率。

發佈了34 篇原創文章 · 獲贊 23 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章