一、 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 自動使用并維護索引,插入、刪除、更新表后,自動更新索引
--工作感覺中 所謂oracle自動維護在插入后,其實好像并非如此!不是oracle 獨立的進程在 插入后開始維護
而是在插入這個SESSION中維護,在insert into commit; 語句后維護。
6、 語法:CREATE INDEX index ON table (column[, column]...);
7、 B-tree結構(非bitmap):
[一]了解索引的工作原理:
表:emp
目標:查詢Frank的工資salary
建立索引:create index emp_name_idx on emp(name);
以下圖說明節點和葉節點的關系,節點負責二叉樹的路徑,如同書目錄左邊的目錄列表 ;
葉節點就是目錄列表右邊的頁碼
索引也會很大化 因為它也要存儲些字段和字段的值
三、 唯一索引
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樹索引排序,寫入磁盤。
十、 分區索引
語法:
Table Index
CREATE [UNIQUE|BITMAP] INDEX [schema.] index_name
ON [schema.] table_name
[tbl_alias]
( col
[ASC | DESC]) index_clause
index_attribs
index_clauses:
分以下兩種情況
1. Local Index
就是索引信息的存放位置依賴于父表的Partition信息,換句話說創建這樣的索引必須保證父表是Partition
1.1 索引信息存放在父表的分區所在的表空間。但是僅可以創建在父表為HashTable或者composite分區表的。
LOCAL STORE IN ( tablespace
)
1.2 僅可以創建在父表為HashTable或者composite分區表的。并且指定的分區數目要與父表的分區數目要一致
LOCAL STORE IN
(tablespace)
( PARTITION
[partition
[ LOGGING|NOLOGGING
]
[ TABLESPACE
{tablespace|DEFAULT}]
[ PCTFREE
int]
[ PCTUSED
int]
[ INITRANS
int]
[ MAXTRANS
int]
[ STORAGE
storage_clause]
[ STORE IN
{tablespace_name| DEFAULT
]
[ SUBPARTITION
[subpartition [ TABLESPACE
tablespace]]]])
1.3 索引信息存放在父表的分區所在的表空間,這種語法最簡單,也是最常用的分區索引創建方式。
Local
1.4 并且指定的Partition 數目要與父表的Partition要一致
LOCAL (PARTITION
[ partition
[ LOGGING|NOLOGGING
]
[ TABLESPACE
{ tablespace
|DEFAULT}]
[ PCTFREE
int
]
[ PCTUSED
int
]
[ INITRANS
int
]
[ MAXTRANS
int
]
[ STORAGE
storage_clause
]
[ STORE IN
{ tablespace_name
| DEFAULT
]
[ SUBPARTITION
[ subpartition
[TABLESPACE tablespace
]]]])
Global Index
索引信息的存放位置與父表的Partition信息完全不相干。甚至父表是不是分區表都無所謂的。語法如下:
GLOBAL PARTITION BY RANGE (col_list)
( PARTITION partition
VALUES LESS THAN ( value_list
)
[LOGGING|NOLOGGING]
[TABLESPACE { tablespace
|DEFAULT}]
[PCTFREE int
]
[PCTUSED int
]
[INITRANS int
]
[MAXTRANS int
]
[STORAGE storage_clause
] )
但是在這種情況下,如果父表是分區表,要刪除父表的一個分區都必須要更新Global Index ,否則索引信息不正確
ALTER TABLE
TableName
DROP PARTITION
PartitionName
Update Global Indexes
分區表、分區索引和全局索引:
在一個表的數據超過過2000萬條或占用2G空間時,建議建立分區表。
createtableta(c1int,c2varchar2(16),c3varchar2(64),c4intconstraintpk_taprimarykey(c1))partitionbyrange(c1)(partitionp1valueslessthan(10000000),partitionp2valueslessthan(20000000),partitionp3valueslessthan(30000000),partitionp4valueslessthan(maxvalue)); |
分區索引和全局索引:
分區索引就是在所有每個區上單獨創建索引,它能自動維護,在drop或truncate某個分區時不影響該索引的其他分區索引的使用,也就是索引不會失效,維護起來比較方便,但是在查詢性能稍微有點影響。
createindexidx_ta_c2onta(c2)local(partitionp1,partitionp2,partitionp3,partitionp4);或 者createindexidx_ta_c2onta(c2)local; |
另外在create unique index idx_ta_c2 on ta(c2) local ;系統會報ORA-14039錯誤,這是因為ta表的分區列是c1,oracle不支持在分區表上創建PK主鍵時主鍵列不包含分區列,創建另外的約束 (unique)也不可以。
全局索引就是在全表上創建索引,它可以創建自己的分區,可以和分區表的分區不一樣,也就是它是獨立的索引。在drop或truncate某個分 區時需要創建索引alter index idx_xx rebuild,也可以alter table table_name drop partition partition_name update global indexes;實現,但是要花很長時間在重建索引上。可以通過查詢user_indexes、user_part_indexes和 user_ind_partitions視圖來查看索引是否有效。
createindexidx_ta_c3onta(c3); |
或者把全局索引分成多個區(注意和分區表的分區不一樣):
createindexidx_ta_c4onta(c4)globalpartitionbyrange(c4)(partitionip1valueslessthan(10000),partitionip2valueslessthan(20000),partitionip3valueslessthan(maxvalue)); |
注意索引上的引導列要和range后列一致,否則會有ORA-14038錯誤。
oracle會對主鍵自動創建全局索引
如果想在主鍵的列上創建分區索引,除非主鍵包括分區鍵,還有就是主鍵建在兩個或以上列上。
在頻繁刪除表的分區且數據更新比較頻繁時為了維護方便避免使用全局索引。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
