一 ROWID的概念
存儲了row在數據文件中的具體位置位編碼的數據AZ az + 和 /
row在數據塊中的存儲方式
SELECT ROWID last_name FROM hremployees WHERE department_id = ;
比如OOOOOOFFFBBBBBBRRR
OOOOOOdata object number 對應dba_objectsdata_object_id
FFFfile# 對應v$datafilefile#
BBBBBBblock#
RRRrow#
Dbms_rowid包
SELECT dbms_rowidrowid_block_number(AAAGFqAABAAAIWEAAA) from dual;
具體到特定的物理文件
二 索引的概念
類似書的目錄結構
Oracle 的索引對象與表關聯的可選對象提高SQL查詢語句的速度
索引直接指向包含所查詢值的行的位置減少磁盤I/O
與所索引的表是相互獨立的物理結構
Oracle 自動使用並維護索引插入刪除更新表後自動更新索引
語法CREATE INDEX index ON table (column[ column]);
Btree結構(非bitmap)
[一]了解索引的工作原理
表emp
目標查詢Frank的工資salary
建立索引create index emp_name_idx on emp(name);
[試驗]測試索引的作用
運行/rdbms/admin/utlxplan 腳本
建立測試表
create table t as select * from dba_objects;
insert into t select * from t;
create table indextable
as select rownum idownerobject_namesubobject_name
object_iddata_object_idobject_typecreated
from t;
set autotrace trace explain
set timing on
分析表可以得到cost
查詢 object_name=DBA_INDEXES
在object_name列上建立索引
再查詢
[思考]索引的代價
插入更新
三 唯一索引
何時創建當某列任意兩行的值都不相同
當建立Primary Key(主鍵)或者Unique constraint(唯一約束)時唯一索引將被自動建立
語法CREATE UNIQUE INDEX index ON table (column);
演示
四 組合索引
何時創建當兩個或多個列經常一起出現在where條件中時則在這些列上同時創建組合索引
組合索引中列的順序是任意的也無需相鄰但是建議將最頻繁訪問的列放在列表的最前面
演示(組合列單獨列)
五 位圖索引
何時創建
列中有非常多的重復的值時候例如某列保存了 性別信息
Where 條件中包含了很多OR操作符
較少的update操作因為要相應的跟新所有的bitmap
結構位圖索引使用位圖作為鍵值對於表中的每一數據行位圖包含了TRUE()FALSE()或NULL值
優點位圖以一種壓縮格式存放因此占用的磁盤空間比標准索引要小得多
語法CREATE BITMAP INDEX index ON table (column[ column]);
掩飾
create table bitmaptable as select * from indextable where owner in(SYSPUBLIC);
分析查找建立索引查找
六 基於函數的索引
何時創建在WHERE條件語句中包含函數或者表達式時
函數包括算數表達式PL/SQL函數程序包函數SQL函數用戶自定義函數
語法CREATE INDEX index ON table (FUNCTION(column));
演示
必須要分析表並且query_rewrite_enabled=TRUE
或者使用提示/*+ INDEX(ic_index)*/
七 反向鍵索引
目的比如索引值是一個自動增長的列
多個用戶對集中在少數塊上的索引行進行修改容易引起資源的爭用比如對數據塊的等待此時建立反向索引
性能問題
語法
重建為標准索引反之不行
八 鍵壓縮索引
比如表landscp的數據如下
site feature job
Britten Park Rose Bed Prune
Britten Park Rose Bed Mulch
Britten Park Rose Bed Spray
Britten Park Shrub Bed Mulch
Britten Park Shrub Bed Weed
Britten Park Shrub Bed Hoe
……
查詢時以上列均在where條件中同時出現所以建立基於以上列的組合索引但是發現重復值很多所以考慮壓縮特性
Create index zip_idx
on landscp(site feature job)
compress ;
將索引項分成前綴(prefix)和後綴(postfix)兩部分前兩項被放置到前綴部分
Prefix : Britten Park Rose Bed
Prefix : Britten Park Shrub Bed
實際所以的結構為
Prune
Mulch
Spray
Mulch
Weed
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
From:http://tw.wingwit.com/Article/program/Oracle/201311/17769.html