Oracle 索引建立及管理

2021-09-27 02:50:44 字數 3890 閱讀 4049

oracle索引建立及管理

1.      oracle 索引簡介

在 oracle 資料庫中,儲存的每一行資料都有乙個 rowid 來標識。當 oracle 中儲存著大量的資料時,意味著有大量的 rowid,此時想要快速定位指定的 rowid ,就需要使用索引物件。

當對 oracle 表執行指定條件的查詢時,常規的方法是將所有的記錄取出來,然後再把每一條記錄與查詢條件作對比,最後返回滿足條件的記錄。這樣操作不僅耗費時間並耗費資源。當有了索引之後,只需要在索引中找到符合查詢條件的索引字段值,就可以通過儲存在索引中的 rowid 快速找到表中對應的記錄。

使用者可以根據情況不同建立多種型別的索引。按照索引的儲存方式將索引分為 b 樹索引、位圖索引、反向索引和基於函式的索引。建立索引時需要注意以下幾點:

l   索引應該建立在 where 子句頻繁引用、排序以及分組的列上,如果選擇的列不合適將無法提公升查詢速度;

l   限制索引的個數。索引只要提公升查詢速度,但會降低 dml 操作的速度;

l   指定索引塊空間的使用引數。基於表建立索引時, oracle 會將相應表新增到索引塊。為索引新增資料時, oracle 會按照 pctfree 引數在索引塊上預留部分空間。如果將來在表上執行大量的 insert 操作,那麼應該在建立索引時設定較大的pctfree ;

l   將表和索引部署到相同的表空間,可以簡化表空間的管理;將表和索引部署到不同的表空間,可以提高訪問效能(oracle 能夠並行讀取不同硬碟的資料);

2.      建立索引

在建立索引時, oracle 首先對將要簡歷索引的字段進行排序,然後將排序後的字段值和對應記錄的 rowid 儲存在索引段中。查詢時,根據索引查詢指定條件的 rowid ,再根據 rowid 提取資料行。

1) b 樹索引

b 樹索引時 oracle 最常用的索引型別(也是預設型別),是以 b 樹結構組織並存放索引資料。預設情況下 b 樹索引中的資料是以公升序方式排列的。 b 樹索引是由根塊、分支塊和葉塊組成。

例:為 emp 表的 deptno 列建立索引 index _ test

create 

index 

index _ test 

on emp ( deptno )

pctfree 25

tablespace 

users ;

其中,子句 pctfree 指定為將來 insert 操作所預留的空閒空間,子句 tablespace 指定索引段所在的表空間

2) 位圖索引

當需建立索引列包含的取值太少時,如對性別列建立索引,取值只能是「男」或者「女」,使用 b 樹索引取出來的值任然太多,失去了索引的意義。這種情況需要使用位數索引, 例:

create 

bitmap 

index 

index _ test

on emp ( salary )

tablespace 

users ;

注:初始化引數 create _ bitmap _ area _ size 用於指定建立位圖索引時分配的位圖區大小,預設值為8 mb ,該引數越大建立位圖索引的速度越快。修改該引數語句為:

alter 

system 

set 

create _ bitmap _ area _ size =8388608

scope = spfile ;

修改後需要重新啟動資料庫方可生效;

3) 反向鍵索引

在單調遞增的列上使用 b 樹索引時,若使用者對錶中資料做了刪除操作,將導致對某一邊的葉子節點的大量占用。 oracle 提供另一種索引機制,及反向鍵索引,它可以將新增的資料隨機分散到索引中。反向鍵索引是一種特殊的 b 樹索引,在順序遞增數列上建立索引非常有用。反向鍵索引在原理和儲存結構方面和 b 樹索引類似。當使用者插入記錄時,將列值進行反向操作後進行索引,此時資料不在是遞增的,所以新資料在值的範圍上分布通常比原來的有序樹更均勻。 例:

create 

index 

index _ test

on emp ( deptno ) reverse

tablespace 

users ;

如果該列上已經建立了 b 樹索引,那麼可以將其修改為反向鍵索引:

alter 

index 

index _ test

rebulid 

reverse ;』

4) 基於函式的索引

使用者在使用資料庫時,最常遇到的問題是大小寫字元敏感。例如在 emp 表中 job 欄位有 manager 的記錄,當使用者使用小寫搜尋時則無法找到該記錄,只能通過函式 upper 對應進行轉換,在使用轉換後的資料進行檢查。但是這樣查詢是,即便 job列有普通索引, oracle 也會執行全表搜尋,並為遇到的各個行計算 upper 函式。這種情況可以使用建立基於函式的索引,通常只是常規 b 樹索引,但是它存放的資料是由表中資料應用函式後得到的,而不是直接存放表中的資料本身。

如果習慣使用小寫字串,可以建立如下索引:

create 

index 

index _ test

on emp ( lower ( job ));

3.      修改索引

修改索引使用 alter 

index 完成。

為表建立索引後,隨著對錶不斷進行更替、插入和刪除動作,索引中國會產生越來越多的儲存碎片,導致索引工作效率降低。這是可以採取重建索引和合併索引清除碎片。合併索引只是將 b 樹中葉子節點的儲存碎片合併在一起,並不會改變索引的物流組織結構。

合併索引:

alter 

index 

index _ test

coalesce 

deallocate 

unused ;

重建索引:

alter 

index 

index _ test 

rebuild

tablespace 

user 1;

重建索引時可以更改索引的型別,儲存表空間等

4.      刪除索引

刪除索引使用 drop 

index 語句。當索引過於碎片化,或者不經常被用到時,既可以刪除索引:

drop 

index 

index _ test ;

注:刪除表是也會刪除其相應的索引。

5.      顯示索引資訊

為了顯示索引的資訊, oracle 提供了一系列資料字典檢視,使使用者了解索引的各方面資訊。

1) 顯示表的所有索引:顯示 emp 的所有索引

select * from 

dba _ indexs 

where 

owner =』 emp 』

2) 顯示索引列:顯示 index _ test 所使用的索引列:

select * from 

user _ ind _ columns 

where 

index _ name =』 index _ test 』

3) 顯示索引位置及大小

select * from 

user _ segments 

where 

segment _ name =』 index _ test 』

4) 顯示函式索引

select * from 

user _ ind _ expressions 

where 

index _ name =』 index _ test 』

oracle 索引失效 建立及重建

兩三個月沒有做資料分析了,今天一分析,竟然發現很多索引 約30 失效。失效原因大致有以下幾種 在sql loader 載入過程中會維護索引,由於資料量比較大,在sql loader 載入過程中出現異常情況,導致oracle 來不及維護索引,導致索引處於失效狀態,影響查詢和載入。異常情況主要有 在載入...

Oracle 建立索引及SQL優化

oracle 建立索引及sql優化 資料庫索引 索引有單列索引 復合索引之說 如何某錶的某個欄位有主鍵約束和唯一性約束,則oracle 則會自動在相應的約束列上建議唯一索引。資料庫索引主要進行提高訪問速度。建設原則 1 索引應該經常建在where 子句經常用到的列上。如果某個大表經常使用某個字段進行...

Oracle 建立索引及SQL優化

資料庫索引 索引有單列索引 復合索引之說 如何某錶的某個欄位有主鍵約束和唯一性約束,則oracle 則會自動在相應的約束列上建議唯一索引。資料庫索引主要進行提高訪問速度。建設原則 1 索引應該經常建在where 子句經常用到的列上。如果某個大表經常使用某個字段進行查詢,並且檢索行數小於總表行數的5 ...