Oracle索引

Oracle索引

在oracle索引是一種供伺服器在表中快速查找一個行的資料庫結構。合理使用索引能夠大大提高資料庫的運行效率。

基本介紹

  • 中文名:Oracle索引
  • 用處:提高資料庫的運行效率
  • 類別:資料庫結構
概念及作用,索引的分類,索引使用原則,創建語法,語法分析,

概念及作用

在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]

語法分析

UNIQUE指定索引所基於的列(或多列)值必須唯一。默認的索引是非唯一的。
BITMAP指定建立位映射索引而不是B*索引。位映射索引保存的行標識符與作為位映射的鍵值有關。位映射中的每一位都對應於一個可能的行標識符,位設定意味著具有對應行標識符的行包含該鍵值。
ONtable_name建立基於函式的索引。用table_name的列、常數、SQL函式和自定義函式創建的表達式。指定column_expression,以後用基於函式的索引查詢時,必須保證查詢該column_expression不為空。
CLUSTER創建cluster_name簇索引。若表不用schema限制,oracle假設簇包含在你自己的方案中。不能為散列簇創建簇索引。
NOSORT資料庫中的行以升序保存,在創建索引時不必對行排序。若索引列或多列的行不以升序保存,oracle會返回錯誤。
REVERSE指定以反序索引塊的位元組,不包含行標識符。NOSORT不能與REVERSE一起指定。

索引使用原則

在正確使用索引的前提下,索引可以提高檢索相應的表的速度。當用戶考慮在表中使用索引時,應遵循下列一些基本原則。
(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]

語法分析

UNIQUE指定索引所基於的列(或多列)值必須唯一。默認的索引是非唯一的。
BITMAP指定建立位映射索引而不是B*索引。位映射索引保存的行標識符與作為位映射的鍵值有關。位映射中的每一位都對應於一個可能的行標識符,位設定意味著具有對應行標識符的行包含該鍵值。
ONtable_name建立基於函式的索引。用table_name的列、常數、SQL函式和自定義函式創建的表達式。指定column_expression,以後用基於函式的索引查詢時,必須保證查詢該column_expression不為空。
CLUSTER創建cluster_name簇索引。若表不用schema限制,oracle假設簇包含在你自己的方案中。不能為散列簇創建簇索引。
NOSORT資料庫中的行以升序保存,在創建索引時不必對行排序。若索引列或多列的行不以升序保存,oracle會返回錯誤。
REVERSE指定以反序索引塊的位元組,不包含行標識符。NOSORT不能與REVERSE一起指定。

相關詞條

熱門詞條

聯絡我們