1. 程式人生 > 資料庫 >Oracle中的索引詳解

Oracle中的索引詳解

一、 ROWID的概念

儲存了row在資料檔案中的具體位置:64位 編碼的資料,A-Z, a-z, 0-9, +, 和 /,

row在資料塊中的儲存方式

SELECT ROWID, last_name FROM hr.employees WHERE department_id = 20;

比 如:OOOOOOFFFBBBBBBRRR

OOOOOO:data object number, 對應dba_objects.data_object_id

FFF:file#, 對應v$datafile.file#

BBBBBB:block#

RRR:row#

Dbms_rowid包

SELECT dbms_rowid.rowid_block_number('AAAGFqAABAAAIWEAAA') from dual;

具 體到特定的物理檔案

二、 索引的概念

1、 類似書的目錄結構

2、 Oracle 的“索引”物件,與表關聯的可選物件,提高SQL查詢語句的速度

3、 索引直接指向包含所查詢值的行的位置,減少磁碟I/O

4、 與所索引的表是相互獨立的物理結構

5、 Oracle 自動使用並維護索引,插入、刪除、更新表後,自動更新索引

6、 語法:CREATE INDEX index ON table (column[, column]...);

7、 B-tree結構(非bitmap):

[一]瞭解索引的工作原理:

表:emp

目標:查詢Frank的工資salary

建立索 引:create index emp_name_idx on emp(name);

 


[試驗]測試索引的作用:

1. 執行/rdbms/admin/utlxplan 指令碼

2. 建立測試表

create table t as select * from dba_objects;

insert into t select * from t;

create table indextable

as select rownum id,owner,object_name,subobject_name,

object_id,data_object_id,object_type,created

from t;

3. set autotrace trace explain

4. set timing on

5. 分析表,可以得到cost

6. 查詢 object_name=’DBA_INDEXES’

7. 在object_name列上建立索引

8. 再查詢

[思考]索引的代價:

插入,更新

三、 唯一索引

1、 何時建立:當某列任意兩行的值都不相同

2、 當建立Primary Key(主鍵)或者Unique constraint(唯一約束)時,唯一索引將被自動建立

3、 語法:CREATE UNIQUE INDEX index ON table (column);

4、 演示

四、 組合索引

1、 何時建立:當兩個或多個列經常一起出現在where條件中時,則在這些列上同時建立組合索引

2、 組合索引中列的順序是任意的,也無需相鄰。但是建議將最頻繁訪問的列放在列表的最前面

3、 演示(組合列,單獨列)

五、 點陣圖索引

1、 何時建立:

列中有非常多的重複的值時候。例如某列儲存了 “性別”資訊。

Where 條件中包含了很多OR操作符。

較少的update操作,因為要相應的跟新所有的bitmap

2、 結構:點陣圖索引使用點陣圖作為鍵值,對於表中的每一資料行點陣圖包含了TRUE(1)、FALSE(0)、或NULL值。

3、 優點:點陣圖以一種壓縮格式存放,因此佔用的磁碟空間比標準索引要小得多

4、 語法:CREATE BITMAP INDEX index ON table (column[, column]...);

5、 掩飾:

create table bitmaptable as select * from indextable where owner in('SYS','PUBLIC');

分析,查詢,建立索引,查詢

六、 基於函式的索引

   1、 何時建立:在WHERE條件語句中包含函式或者表示式時

2、 函式包括:算數表示式、PL/SQL函式、程式包函式、SQL函式、使用者自定義函式。

3、 語法:CREATE INDEX index ON table (FUNCTION(column));

4、 演示

必須要分析表,並且 query_rewrite_enabled=TRUE

或者使用提示/*+ INDEX(ic_index)*/

七、 反向鍵索引

目的:比如索引值是一個自動增長的列:

多個使用者對集中在少數塊上的索引行進行修改,容易引起資源的爭用,比如對資料塊的等待。此時建立反向索 引。

效能問題:

語法:

重建為標準索引:反之不行

八、 鍵壓縮索引

比如表landscp的資料如下:

site feature job

Britten Park, Rose Bed 1, Prune

Britten Park, Rose Bed 1, Mulch

Britten Park, Rose Bed 1,Spray

Britten Park, Shrub Bed 1, Mulch

Britten Park, Shrub Bed 1, Weed

Britten Park, Shrub Bed 1, Hoe

……

查詢時,以上3列均在where條件中同時出現,所以建立基於以上3列的組合索引。但是發現重複值很多,所以考慮壓縮特性。

Create index zip_idx

on landscp(site, feature, job)

compress 2;

將索引項分成字首(prefix)和字尾(postfix)兩部分。前兩項被放置到字首部分。

Prefix 0: Britten Park, Rose Bed 1

Prefix 1: Britten Park, Shrub Bed 1

實際所以的結構為:

0 Prune

0 Mulch

0 Spray

1 Mulch

1 Weed

1 Hoe

特點:組合索引的字首部分具 有非選擇性時,考慮使用壓縮。減少I/O,增加效能。

九、 索引組織表(IOT)

將表中的資料按照索 引的結構儲存在索引中,提高查詢速度。

犧牲插入更新的效能,換取查詢 效能。通常用於資料倉庫,提供大量的查詢,極少的插入修改工作。

必須指定主鍵。插入資料時,會根據主鍵列進行B樹索引排序,寫入磁碟。

十、 分割槽索引

簇:

A cluster is a group of tables that share the same data blocks because they share common columns and are often used together.