Oracle中的索引詳解

1、 ROWID的概念函數

存儲了row在數據文件中的具體位置:64位 編碼的數據,A-Z, a-z, 0-9, +, 和 /,post

row在數據塊中的存儲方式性能

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

比 如:OOOOOOFFFBBBBBBRRR編碼

OOOOOO:data object number, 對應dba_objects.data_object_idspa

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

BBBBBB:block#3d

RRR:row#對象

Dbms_rowid包blog

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

具 體到特定的物理文件

2、 索引的概念

一、 相似書的目錄結構

二、 Oracle 的「索引」對象,與表關聯的可選對象,提升SQL查詢語句的速度

三、 索引直接指向包含所查詢值的行的位置,減小磁盤I/O

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

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

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

七、 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. 再查詢

[思考]索引的代價:

插入,更新

3、 惟一索引

一、 什麼時候建立:當某列任意兩行的值都不相同

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

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

四、 演示

4、 組合索引

一、 什麼時候建立:當兩個或多個列常常一塊兒出如今where條件中時,則在這些列上同時建立組合索引

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

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

5、 位圖索引

一、 什麼時候建立:

列中有很是多的重複的值時候。例如某列保存了 「性別」信息。

Where 條件中包含了不少OR操做符。

較少的update操做,由於要相應的跟新全部的bitmap

二、 結構:位圖索引使用位圖做爲鍵值,對於表中的每一數據行位圖包含了TRUE(1)、FALSE(0)、或NULL值。

三、 優勢:位圖以一種壓縮格式存放,所以佔用的磁盤空間比標準索引要小得多

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

五、 掩飾:

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

分析,查找,創建索引,查找

6、 基於函數的索引

   一、 什麼時候建立:在WHERE條件語句中包含函數或者表達式時

二、 函數包括:算數表達式、PL/SQL函數、程序包函數、SQL函數、用戶自定義函數。

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

四、 演示

必需要分析表,而且 query_rewrite_enabled=TRUE

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

7、 反向鍵索引

目的:好比索引值是一個自動增加的列:

多個用戶對集中在少數塊上的索引行進行修改,容易引發資源的爭用,好比對數據塊的等待。此時創建反向索 引。

性能問題:

語法:

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

8、 鍵壓縮索引

好比表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,增長性能。

9、 索引組織表(IOT)

將表中的數據按照索 引的結構存儲在索引中,提升查詢速度。

犧牲插入更新的性能,換取查詢 性能。一般用於數據倉庫,提供大量的查詢,極少的插入修改工做。

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

10、 分區索引

簇:

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

 
轉載:http://www.oschina.net/question/30362_4057
 
 
相關文章
相關標籤/搜索