1. 程式人生 > >ORACLE資料庫的索引型別及其適用場景

ORACLE資料庫的索引型別及其適用場景

邏輯上:
Single column 單行索引
Concatenated 多行索引
Unique 唯一索引
NonUnique 非唯一索引
Function-based函式索引
Domain 域索引
物理上:
Partitioned 分割槽索引
NonPartitioned 非分割槽索引
B-tree:
Normal 正常型B樹
Rever Key 反轉型B樹 
Bitmap 點陣圖索引

1)b-tree索引

Oracle資料庫中最常見的索引型別是b-tree索引,也就是B-樹索引,以其同名的計算科學結構命名。每當你釋出基本的沒有經過進 一步修改的CREATE INDEX語句時,就是在建立b-tree索引。這裡不打算對b-tree索引進行更多深入的探討,這些使用者都可以自己瞭解。基本上這些索引儲存你建立的 索引所在的列值以及用來查詢自身行的指向實際資料表的指標。記住,這也就意味著要進行多路查詢,其中一個查詢各個節點和索引的葉節點,然後才是表的行自 身。這就是為什麼Oracle的優化器在某種情況下會選擇執行全表掃描而不執行索引查詢的原因了,因為全表掃描執行起來實際上可能會更快一些。還要注意的 是,如果你的索引是建立在多個列上的話,那麼第一列(leading column)非常重要。假設你有一個多列索引(也稱為級聯索引),索引列的排列順序是c列到d列,你可以對使用該索引c列單獨進行一次查詢,但你不能使 用該索引對d列冶金行一次單獨的查詢。


2)基於函式的索引
如果在搜尋時你讀取很多行,或者你的索引選擇性不大,又或者你在級聯索引中使用了第一列以外的列,Oracle資料庫有時候會選擇不使用索 引。那麼如果你想要執行一個大小寫不敏感的搜尋呢?像下面的指令:WHERE UPPER(first_name) = ‘JOHN’。
 
  這也不會使用first_name欄位上的索引。為什麼?因為Oracle不得不將UPPER函式用在該索引所有(ALL)的值上,所以還不如做一次全表掃描。所以,很多時候Oracle建立基於函式的索引就是為了這個目的。
3)反轉關鍵字索引
你還可以看到這些反轉關鍵字索引,而且不時還要用到這些索引。假設有一列包含了“餐廳甲”、“餐廳乙”、“餐廳丙”等類似名字。可能這不是 一個很好的例子,不過關鍵的一點是擁有很多唯一值,但其關鍵字的前面一部分變化不大。因為Oracle會在將REVERSE關鍵字指定給b-tree前把 REVERSE字串簡化,所以使用反轉關鍵字索引可能是最好的。這樣的一個索引可能更平衡、有用,搜尋起來更快。


Oracle還提供了很多更為複雜的索引型別。不過請注意,你最好全面閱讀過相關的說明文件後再使用這些索引,因為它們各自都有各自特定的適用範圍。
1)點陣圖索引(bitmap index)
假設資料庫表中有一列其選擇性非常窄,例如性別列,該用什麼型別的索引?你可能會考慮對其使用點陣圖索引。因為點陣圖索引正是為相異值很少的列 而建立的。但需要考慮的因素還不只這些。一般而言,只有當你對錶中值相宜度較小的多個不同的列都使用點陣圖索引,這樣點陣圖索引才有用,因為你可以一起使用這 些索引才能對列產生更大的選擇性,否則你還是需要對這些列進行一次全表掃描。例如,對於性別列,其索引只能有兩個唯一值,那麼用這個索引對錶的任何搜尋有 可能都返回一半的記錄。其次,這些索引是為資料倉庫而設計的,所以其假定條件是資料不會發生很大的改變。這些索引不能用來滿足事務資料庫或更新頻繁的資料 庫。應該說,對點陣圖索引的表進行更新根本沒有一點效率。
2)點陣圖連線索引(bitmap join index)
點陣圖連線索引比點陣圖索引更進了一步。這些索引將點陣圖化的列完全從表資料中抽取出來,並將其儲存在索引中。其假定條件是這些列集合必須一起查 詢。同樣的,這也是為資料倉庫資料庫而設計的。除了在句法最後有一個WHERE子句之外,點陣圖連線索引的建立指令就像建立點陣圖索引的CREATE BITMAP INDEX一樣。
3)壓縮索引
壓縮索引實際是標準b-tree索引的一個選項。壓縮索引的葉節點更少,所以總的I/O數量和需要的快取也更少。這些都意味著Oracle 的優化器更可能使用這些壓縮索引,而不傾向於使用標準的非壓縮索引。不過,這些好處也是有代價的,當你對這些壓縮索引進行存取操作時,要消耗更多的CPU 來進行解壓縮。而且,當你閱讀關於優化器如何使用這些索引,又是如何選擇合適的壓縮級別的資料時,就開始變得晦澀了。不同的使用者不同的設定從壓縮索引中得 到的好處也可能會有所不同。
4)降序索引(descending index)
這是基於函式索引的一種特殊型別。降序索引可以顯著優化ORDER BY x, y, z DESC子句查詢的。
5)分割槽索引(partitioned index)
如果你的資料庫中有一個分割槽表,你就有機會體驗幾種新的索引型別,從貫穿所有分割槽的全域性分割槽索引(global)和集中於各個單獨分割槽的本地分割槽索引(local)。這裡不再進行贅述,想知道細節問題可以查詢相關文獻。
6)索引組織表(index organized table,IOT)
這是在Oracle 9i中引進的一種新型別表。Oracle會將級聯索引及其擴充套件型別的索引用於表中所有的列。當所有資料都載入到索引結構之後,表就成多餘的了,你儘可以將表本身刪除掉。這就是索引組織表。
7)簇索引(cluster index)
基本上,簇索引就是將多個表的相同列放在一起,而對該列使用用一個簇索引。這種索引在實際應用中比較少,因為還有各種有待解決的效能問題存在。
8)域索引(domain index)
當我們建立為使用者自定義資料型別(datatype)建立使用者自定義索引型別(indextype)時就要使用域索引。
9)隱藏索引(invisible index)
這是Oracle 11g中推出的新特性。其建立過程和標準索引一樣,但建立後對於基於代價的優化器(CBO)是不可見的。這可以讓你對效能進行大型測試查詢,而不會影響現有的正在執行的應用程式。
10)虛擬索引(virtual index)
這是為測試人員和開發人員準備的又一個工具。虛擬索引(不分配段空間)可以讓你在不需要實際建立索引的情況下,測試新索引及其對查詢計劃的影響。對於GB級的表來說,構建索引非常耗費資源而且還要佔用大量時間。
11)其他的索引型別
Oracle資料庫還提供了很多其他型別的索引,例如用來為字元型大型二進位制物件(CLOB)或其他大型文字資料構建索引的Oracle TEXT,Oracle Spatial等。有興趣的讀者可以自己查詢相關資料瞭解。
都是為了優化器
如果你曾經廣泛接觸過MySQL和其他的資料庫,你會發現甲骨文雖然是全球領先的資料庫供應商,但它們的資料庫對於使用者來說用起來其實並不 是很方便。提到優化器這個問題可能有點離題了,不過Oracle資料庫最基本的食料就是優化器了,這的確是種挺特別的調料,而且變得越來越美味了。市面上 有很多以Oracle基於代價的優化器(Cost Based Optimizer,CBO)為主題內容的書籍,專門介紹分析表和索引的技巧和策略。
對於資料庫,除了需要一直更新你的統計資訊之外,你可能還需要不斷測試新的查詢。使用解析計劃機制,並進行優化以便減少總I/O量以及排序和合並資料的計算量,只有這樣你才能獲得更好的效能表現。
總結
雖然Oracle資料庫的索引世界有點嚇人,不過實際上你平常經常使用的索引就只有那麼一些。而且,不管唱反調的人怎樣詆譭,Oracle 的優化器都已經設計相當出色;總體而言,Oracle很擅長於讓你的資料庫執行地更有效率。雖然這並不意味著你不需要對自己的SQL進行調優,不過,如果 你一直保持著最新的統計資訊,並讓Oracle為你整理出你所需要的最小資料集的話,它能夠以極快的速度滿足你的需要。

相關推薦

ORACLE資料庫索引型別及其適用場景

邏輯上: Single column 單行索引 Concatenated 多行索引 Unique 唯一索引 NonUnique 非唯一索引 Function-based函式索引 Domain 域索引 物理上: Partitioned 分割槽索引 NonPartitioned

mysql索引型別以及適用場景

1.普通索引 最基本的索引,沒有任何限制 2.唯一索引 索引列的值必須唯一,但允許有空值 3.主鍵索引 主鍵索引屬於一種特殊的唯一索引,不允許有空值 4.單列索引

MySQL 索引分類和適用場景

一、 MySQL: 索引以B樹格式儲存 Memory儲存引擎可以選擇Hash或BTree索引,Hash索引只能用於=或<=>的等式比較。 1、普通索引:create index on Tablename(列的列表) alter table TableName add

MySql索引型別及其機制

一、MySql索引型別 Mysql目前主要有以下幾種索引型別:FULLTEXT,HASH,BTREE,RTREE。 Mysql常見索引有:主鍵索引、唯一索引、普通索引、全文索引、組合索引 FULLTEXT 即為全文索引,目前只有MyISAM引擎支援。其可以在

什麼是Redis及其適用場景

什麼是Redis? Redis全稱(Remote Dictionary Server); Redis本質上是一個Key-Value型別的記憶體資料庫,整個資料庫統統載入在記憶體當中進行操作,定期通過非同步操作把資料庫資料flush到硬碟上進行儲存。因為是純記憶體操作,Redis的

Oracle資料庫date型別與Java中Date的聯絡與轉化

以下是對Java中的日期物件與Oracle中的日期之間的區別與聯絡做點說明,以期對大家有所幫助。 new Date():分配 Date 物件並初始化此物件,以表示分配它的時間(精確到毫秒),就是系統當前。 new Date(long date) : 分配 Date 物件並

Redis的基本資料型別適用場景

一些廢話 在負責的一個小專案中,慢慢的出現了一些效能的問題。由於I/O操作資料量過大,會消耗許多效能。然後開始研究如何去使用redis去優化。 雖然一直有使用redis,但僅僅用在儲存session。基本上配置好後就沒研究過redis,所以今天花了點時間學習

資料庫索引型別及實現方式

1、索引定義   資料庫索引好比是一本書前面的目錄,能加快資料庫的查詢速度。索引是對資料庫表中一個或多個列(例如,employee 表的姓氏 (lname) 列)的值進行排序的結構。如果想按特定職員的姓來查詢他或她,則與在表中搜索所有的行相比,索引有助於更快地獲取資訊。 2、建立索引的優缺點: 優點:

MySQL資料庫索引型別

在資料量偏大的時候執行查詢語句查詢時間會變長,這時我們會根據需求在資料庫中新增索引來加快查詢效率。我們先來做個測試,不加索引和加索引下的效率對比。 在card_code列沒加索引的時,查詢時間如下,大概都在0.07秒。  我們來加上索引試試,加上後查詢效率高了許多。

mybatis中查詢oracle資料庫date型別的時間沒有時分秒

    原因出在mybatis中的mapper.xml中物件的屬性對應的jdbcType=date,jdbcType=date對應的Java型別是java.sql.date,所以沒有時分秒。如果想顯示時分秒,物件的屬性對應的jdbcType應該設定成TIMESTAMP,例如:

深入理解四種資料庫索引型別(- 唯一索引/非唯一索引

唯一索引/非唯一索引主鍵索引(主索引)聚集索引/非聚集索引組合索引唯一索引/非唯一索引唯一索引1.唯一索引是在表上一個或者多個欄位組合建立的索引,這個或者這些欄位的值組合起來在表中不可以重複。非唯一索引2.非唯一索引是在表上一個或者多個欄位組合建立的索引,這個或者這些欄位的值組合起來在表中可以重複,不要求唯一

Oracle資料庫Clob型別儲存XML資料下節點內容查詢

今天有個sql查詢用到了在clob型別下查詢xml資料某個節點值,通過百度後在這裡記錄一下 xml資料格式如下: <?xml version="1.0" encoding="GBK"?> <flowdoc> <meta

Oracle資料庫索引培訓——201609

1. 資料庫發展概要介紹 觀點:關係資料庫在子應用中還是會繼續存在,隨著資料大爆炸的不斷升級,關係資料庫將會更方便的遷移到大資料平臺。大資料引導消費、大資料支撐模型、大資料輔助決策 將 會是一個商業常態。 2. Oracle優化器(RBO與CBO) Oracl

redis 五種資料型別及其使用場景

String 1、String 常用命令: 除了get、set、incr、decr mget等操作外,Redis還提供了下面一些操作: 獲取字串長度 往字串append內容 設定和獲取字串的某一段內容 設定及獲取字串的某一位(bit) 批量設

架構師最常使用的5種架構模式及其適用場景分析

好萊塢電影中有多少情節?一些電影評論家說只有五個。您可以採用幾種架構來實現應用程式?目前大多數程式都使用下面提到的五種架構之一。 在本文中,我將五種軟體架構模式的優缺點以及適合場景提煉出來作為快速參考。你可以在單個系統中使用多個架構模式,它們的組合既是電腦科學,也是一門藝術。 ## 一、分層架構 這種

跟我一起學Redis之五種基本型別及其應用場景舉例(幹了6個小時)

**前言** 來啦,老弟?來啦,上一篇就當嘮嘮嗑,接下來就開始進行實操擼命令,計劃是先整體單純說說Redis的各種用法和應用,最後再結合程式碼歸納總結。 Redis預設有16個數據庫(編號為0~15),預設使用第0個,通過命令select任意切換資料庫,和MySql切換資料庫一個道理;各資料庫之間的資

oracle分割槽表中本地索引和全域性索引適用場景

【背景】分割槽表建立好了之後,如果需要最大化分割槽表的效能就需要結合索引的使用,分割槽表有兩種索引:本地索引和全域性索引。既然存在著兩種的索引型別,相信存在即合理。既然存在就會有存在的原因,也就是在特定的場景中就更能發揮出索引的效能的; 本文件通過測試,總結出兩種索引的適合

Oracle 資料庫 各種索引型別 簡單介紹

各種Oracle索引型別介紹 邏輯上: Single column 單行索引 Concatenated 多行索引 Unique 唯一索引 NonUnique 非唯一索引 Function-based函式索引 Domain 域索引 物理上: Partitioned 分割槽索引 NonParti

python字符串連接的三種方法及其效率、適用場景詳解

通過 lists bash clear 必須 內存 連接 utf-8 site python字符串連接的方法,一般有以下三種:方法1:直接通過加號(+)操作符連接website=& 39;python& 39;+& 39;tab&

Oracle索引——索引型別

Oracle 提供了多種不同型別的索引以供使用。簡單地說, Oracle 中包括如下索引:  B* 樹索引 這些是我所說的 “ 傳統 “ 索引。到目前為止,這是 Oracle