Oracle資料庫索引

2021-07-09 23:20:28 字數 3528 閱讀 6439

標籤: 資料庫

oracle

索引index

2013-06-14 16:54

4148人閱讀收藏 

舉報

database(6)

目錄(?)

[-]

索引基本概念

索引的作用

索引的架構

oracle索引的型別

1 基於函式的索引

2 位圖索引

oracle索引的實現

索引是用於加速資料訪問的資料物件,合理的使用索引可以大幅降低i/o次數,從而提高資料訪問效能。

單列索引:在乙個列上建立的索引,比如:

[sql]view plain

copy

-- oracle預設建立b-tree索引

create

index

索引名 

on表名(列名)  

復合索引:在兩列或多列上建立的索引。在同一張表上可以有多個索引,但是這些索引所包含的列的組合必須不完全相同。如:

[sql]view plain

copy

create

index

emp_idx1 

onemp(ename, job);  

create

index

emp_idx2 

onemp(job, ename);  

索引的使用原則:在大表上建立索引才有意義;在where子句(where子句中一般將熵值較大的字段放在後面,sql語句的查詢條件是從右向左)或連線條件上經常使用的列上建立索引;索引的層次不宜超過4層。

索引的缺點:建立索引,系統要占用大約為表的1.2倍的硬碟和記憶體空間來儲存索引;更新資料時,必須同時對索引進行更新,以維持資料和索引的一致性。

因此,不恰當的索引反而會降低系統效能,因為在資料插入、修改和刪除時需要額外的時間更新索引。例如,如在如下字段建立索引一般是不恰當的:很少或從不引用的字段;邏輯型字段,如男或女(是或否)等。總之,建立索引提高查詢效率是以消耗一定的系統資源(額外的儲存和增刪改操作額外的索引更新時間)為代價的,dba需要慎重考慮在哪些欄位上建立索引,以及建立哪種索引。

支援快速查詢

對於儲存大量資料的資料庫,線性查詢效率很低,索引技術使資料庫支援次線性時間查詢以提高查詢效能。索引是所有提高查詢效能的資料結構。目前已經有許多資料結構可用於提高查詢速度,事實上電腦科學領域的研究有很大一部分工作是對索引資料結構的研究和分析。索引資料結構的研究需要考慮查詢效能、索引大小和索引更新效能等方面的折中。許多索引提供對數時間複雜度(o(logn(n)))的查詢效能,某些情況下甚至可以獲得o(1)時間複雜度。

實現資料庫約束

索引也可以用於實現資料庫的約束,如unique,exclusion,primary key和foreign key。unique索引約束其所引用的列,該列的值唯一。資料庫系統通常會預設在primary key(主鍵)的列上建立索引。

在sybase中,分為clustered indexes(聚集索引)和nonclustered indexes(非聚集索引)。聚集索引是一種特殊的索引,它把表中的記錄的物理儲存重新排序。因此,每張表只能有乙個聚集索引。聚集索引的葉節點包含資料頁。

非聚集索引中,索引的邏輯順序與物理儲存順序不同。非聚集索引的葉節點中不包含資料頁,而是包含索引行。

oracle中並不存在這兩種索引。僅從技術上講,oracle的iot(index organized table)可以實現clustered indexes的作用,但是通常不推薦這麼做。

oracle提供了稱為cluster的結構,但與上述兩種索引並無關係。cluster是一種將多個表存到同乙個block中的方法。正常情況下,乙個block包含1個表的資料。在乙個cluster中,多個表的資料共享同乙個block。

按照資料儲存方式,分為b-樹索引、反向索引、位圖索引,b-樹索引建立在重複值很少的列上,位圖索引建立在重複值很多、不同值相對固定的列上。

按照索引列的個數,分為單列索引、復合索引;

按照索引列值的唯一性,分為唯一索引、非唯一索引。

此外還有函式索引、全域性索引、分割槽索引等。

oracle資料庫提供以下型別的索引:

oracle也支援基於函式的索引和某個應用的域索引(domain indexes)。

基於函式的索引sql語句如下:

[sql]view plain

copy

-- 基本結構

create

[unique

] index

index_name  

ontable_name (function1, function2, . function_n)  

[ compute statistics

];  

-- 例子

create

index

supplier_idx  

onsupplier (

upper

(supplier_name));  

compute statistics表示是否收集索引的統計資訊。

目前大量使用的索引一般主要是b-tree索引,在索引結構中儲存著鍵值和鍵值的rowid,並且是一一對應的。而位圖索引主要針對大量相同值的列而建立,例如:類別,操作員,部門id等。位圖索引由於只儲存鍵值的起止rowid和點陣圖,占用的空間非常少。

位圖索引非常適合於資料倉儲應用,因為資料倉儲處理的是大量即席查詢,幾乎沒有併發的事務。位圖索引提供以下優勢:

位圖索引不適合oltp應用,oltp應用需要處理大量併發的修改資料的事務。位圖索引更適合於基於資料倉儲的決策支援系統,因為決策支援系統主要是查詢資料而不是修改資料。位圖索引頁不適合於主要用於大於或小於比較的列,只適合於等式查詢,特別是and,or和not操作;大於和小於比較更適合採用b-tree索引。

[sql]view plain

copy

create

bitmap 

index

索引名 

on表名 (列名);  

oracle資料庫使用b-tree結構組織索引以加速資料訪問。如果沒有索引,就只能順序掃瞄整個資料庫。對於n行的表,平均掃瞄行數是n/2。

如果將這些記錄根據它們的某一列組織成b-tree結構,乙個葉節點代表一條資料,那麼從n行的表中查詢一條記錄的平均用時為log(n)。這就是oracle資料庫索引的基本原理。

b-tree的分支節點包含到其子節點的索引。最低層節點(葉節點)包含了索引資料值和其對應的rowid,rowid用於定位對應的資料表行。

參考:overview of indexes. 

create index. 

about indexes. 

Oracle資料庫 索引

索引通過指標的形式提高資料查詢的速度。如果乙個資料量比較大的資料庫經常被查詢而插入刪除的次數較少,則應該建立索引,相反,小表或經常被插入或修改,則不建議建立索引。1.建立索引 create index emp phone number ix on employees phone number 2.建...

Oracle資料庫 索引

索引是定義在儲存表基礎之上,有助於無需檢查所有記錄而快速定位所需記錄的一種輔助儲存結構,由一系列儲存在磁碟上的索引項 index entries 組成,每個索引項又由兩部分構成 索引字段 由table中某些列 通常是一列 中的值串接而成,索引中通常儲存了索引欄位的每乙個值 也有例外 索引字段類似於詞...

Oracle資料庫索引

建立索引 create index idx zsq on zsq01 id 將索引置為無效 alter index idx zsq unusable 重新啟用索引 三種方式 alter index idx zsq rebuild alter index idx zsq rebuild nologgi...