概念及作用
在oracle中,索引是一種供伺服器在表中快速查找一個行的資料庫結構。在資料庫中建立索引主要有以下作用。
(1)快速存取數據。
(2)既可以改善資料庫性能,又可以保證列值的唯一性。
(3)實現表與表之間的參照完整性
(4)在使用orderby、groupby子句進行數據檢索時,利用索引可以減少排序和分組的時間。
索引的分類
在關係資料庫中,每一行都由一個行唯一標識RowID。RowID包括該行所在的檔案、在檔案中的塊數和塊中的行號。索引中包含一個索引條目,每一個索引條目都有一個鍵值和一個RowID,其中鍵值可以是一列或者多列的組合。
(一)索引按存儲方法分類,可以分為2類:B*樹索引和點陣圖索引。
(1)B*樹索引的存儲結構類似書的索引結構,有分支和葉兩種類型的存儲數據塊,分支塊相當於書的大目錄,葉塊相當於索引到的具體的書頁。Oracle用B*樹機制存儲索引條目,以保證用最短路徑訪問鍵值。默認情況下大多使用B*樹索引,該索引就是通常所見的唯一索引、逆序索引。
(2)點陣圖索引存儲主要用於節省空間,減少oracle對數據塊的訪問。它採用點陣圖偏移方式來與表的行ID號對應,採用點陣圖索引一般是重複值太多的表欄位。點陣圖索引之所以在實際密集型OLTP(在線上事物處理)中用的比較少,是因為OLTP會對表進行大量的刪除、修改、新建操作。Oracle每次進行操作都會對要操作的數據塊加鎖。以防止多人操作容易產生的資料庫鎖等待甚至死鎖現象。在OLAP(在線上分析處理)中套用點陣圖有優勢,因為OLAP中大部分是對資料庫的查詢操作,而且一般採用數據倉庫技術,所以大量數據採用點陣圖索引節省空間比較明顯。當創建表的命令中包含有唯一性關鍵字時,不能創建點陣圖索引,創建全局分區索引時也不能用點陣圖索引。
(二)索引按功能和索引對象分還有以下類型。
(1)唯一索引意味著不會有兩行記錄相同的索引鍵值。唯一索引表中的記錄沒有RowID,不能再對其建立其他索引。在oracle10g中,要建立唯一索引,必須在表中設定主關鍵字,建立了唯一索引的表只按照該唯一索引結構排序。
(2)非唯一索引不對索引列的值進行唯一性限制。
(3)分區索引是指索引可以分散地存在於多個不同的表空間中,其優點是可以提高數據查詢的效率。
(4)未排序索引也稱為正向索引。Oracle10g資料庫中的行是按升序排序的,創建索引時不必指定對其排序而使用默認的順序。
(5)逆序索引也稱反向索引。該索引同樣保持列按順序排列,但是顛倒已索引的每列的位元組。
(6)基於函式的索引是指索引中的一列或者多列是一個函式或者表達式,索引根據函式或表達式計算索引列的值。可以將基於函式的索引建立創建成點陣圖索引。
另外,按照索引所包含的列數可以把索引分為單列索引和複合索引。索引列只有一列的索引為單列索引,對多列同時索引稱為複合索引。
索引使用原則
在正確使用索引的前提下,索引可以提高檢索相應的表的速度。當用戶考慮在表中使用索引時,應遵循下列一些基本原則。
(1)在表中插入數據後創建索引。在表中插入數據後,創建索引效率將更高。如果在裝載數據之前創建索引,那么插入每行時oracle都必須更改索引。
(2)索引正確的表和列。如果經常檢索包含大量數據的表中小於15%的行,就需要創建索引。為了改善多個表的相互關係,常常使用索引列進行關係連線。
(3)主鍵和唯一關鍵字所在的列自動具有索引,但應該在與之關聯的表中的外部關鍵字所在的列上創建索引。
(4)合理安排索引列。在createindex語句中,列的排序會影響查詢的性能,通常將最常用的列放在前面。創建一個索引來提高多列的查詢效率時,應該清楚地了解這個多列的索引對什麼列的存取有效,對什麼列的存取無效。
例如:在A,B,C三列上創建索引
A有效
AB有效
ABC有效
(5)限制表中索引的數量。儘管表可以有任意數量的索引,可是索引越多,在修改表中的數據時對索引做出相應更改的工作量也越大,效率也就越低。同樣,目前不用的索引應該及時刪除。
(6)指定索引數據塊空間的使用。創建索引時,索引的數據塊是用表中現存的值填充的,直到達到PCTFREE為止。如果打算將許多行插入到被索引的表中,PCTFREE就應設定得大一點,不能給索引指定PCTUSED。
(7)根據索引大小設定存儲參數。創建索引之前應先估計索引的大小,以便更好地促進規劃和管理磁碟空間。單個索引項的最大值大約是數據塊大小的一半。
創建語法
Create[UNIQUE|BITMAP]index
[schema.]index_nameon[schema.]table_name(column_name[ASC|DESC],…n,[column_expression])|CLUSTER[schema.]cluster_name
[INITRANSinteger]
[MAXTRANSinteger]
[PCTFREEinteger]
[PCTUESDinteger]
[TABLESPACEtablespace_name]
[STORAGEstorage_clause]
[NOSORT]
[REVERSE]
語法分析
UNIQUE指定索引所基於的列(或多列)值必須唯一。默認的索引是非唯一的。
BITMAP指定建立位映射索引而不是B*索引。位映射索引保存的行標識符與作為位映射的鍵值有關。位映射中的每一位都對應於一個可能的行標識符,位設定意味著具有對應行標識符的行包含該鍵值。
ONtable_name建立基於函式的索引。用table_name的列、常數、SQL函式和自定義函式創建的表達式。指定column_expression,以後用基於函式的索引查詢時,必須保證查詢該column_expression不為空。
CLUSTER創建cluster_name簇索引。若表不用schema限制,oracle假設簇包含在你自己的方案中。不能為散列簇創建簇索引。
NOSORT資料庫中的行以升序保存,在創建索引時不必對行排序。若索引列或多列的行不以升序保存,oracle會返回錯誤。
REVERSE指定以反序索引塊的位元組,不包含行標識符。NOSORT不能與REVERSE一起指定。