一、索引的建立
CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> --默認爲Btree索引
ON <schema>.<table_name>
(<column_name> | <expression> ASC | DESC, --expression基於函數的索引
<column_name> | <expression> ASC | DESC,...) --組合索引
TABLESPACE <tablespace_name> --索引存儲的表空間
STORAGE <storage_settings> --設置表空間存儲參數
LOGGING | NOLOGGING --指定是否產生重作日誌
COMPUTE STATISTICS --建立時收集統計信息
NOCOMPRESS | COMPRESS<nn> --鍵壓縮,刪掉鍵中重複的值
NOSORT | REVERSE --索引順序與表相同,相反
PARTITION | GLOBAL PARTITION<partition_setting> --索引分區html
二、索引特性
索引的好處
加快數據的檢索速度,加速表和表之間的鏈接,減小查詢中分組和排序的時間,提升系統的性能。
索引的不足
建立索引和維護索引要耗費時間,須要佔物理空間,對錶中數據的DML操做,索引也須要動態維護,下降數據維護速度。
應該建索引的列
常常須要搜索的列
常常用在鏈接的列
常常須要排序的列
常用在WHERE 子句中的列
組合索引列中把最頻繁訪問的列放最前
當修改性能遠大於檢索性能時,不要建立索引
e.組合索引時儘可能將過濾大範圍的放在後面,由於SQL執行是從後往前的,
限制索引,使一些索引沒法使用
使用不等於操做符(<> 、 != ),經過把不等於操做符改爲 OR 條件,在RBO下會使用索引,CBO下仍不會使用索引。
使用 IS NULL 或 IS NOT NULL ,要建索引的列儘可能不要有空值;
使用函數,對索引列用函數會限制索引,能夠將函數用在列的取值上;
比較不匹配的數據類型,比較時會將列轉成與值相同的數據類型再比較,能夠轉換值得數據類型;
索引的選擇性(USER_INDEXES.distinct_keys/count(*)),判斷索引返回數據的多少;
羣集因子(USER_INDEXES.Clustering_Factor,與leaf_blocks,num_rows)進行比較,判斷索引列的有序性
二元高度(Binary height),user_INDEXES.Blevel列,二元高度主要隨着表的大小以及被索引的列中值的範圍的狹窄程
度而變化,對索引列的刪除修改會增長二元高度,重建索引可能會下降二元高度。
快速全局掃描,(Fast Full Scan) 容許 Oracle 執行一個全局索引掃描操做。快速全局掃描讀取 B- 樹索引上全部樹葉塊。
跳躍式掃描:容許優化器使用組合索引,即索引的前導列沒有出如今 WHERE 子句中。比全索引掃描要快的多。能夠對組合
索引的部分列使用。express
三、索引管理
重建索引
alter index index_name rebuild tablespace index02;
alter index index_name rebuild online;
對於分區索引,不能總體進行重建,只能對單個分區進行重建。語法以下:
Alter index idx_name rebuild partition index_partition_name [online nologging]
刪除索引,刪除的數據在索引裏只是標記爲刪除,只有刪除的數據大於塊裏存的總記錄,這時一個塊被清空,索引
重建全局索引命令以下:
Alter index idx_name rebuild [online nologging]
總的數據條數纔會減小。
drop index index_name;
整理索引碎片
alter index index_name coalesce;
分析索引
analyze index index_name validate structure;
select height,name,lf_rows,lf_blks,del_lf_rows from index_stats;oracle
四、索引查詢視圖
DBA_INDEXES
USER_INDEXES
USER_IND_COLUMNS
五、ORACLE ROWID
ROWID 其實就是直接指向單獨行的線路圖,提供了訪問單行數據的能力。6/3/6/3:對象/文件/塊/行
查詢表裏行的rowid,塊號
select rowid,dbms_rowid.rowid_block_number(rowid), iid from tb;
工具函數,查詢行所在的文件號,塊號,行號
--工具函數
create or replace function get_rowid
(l_rowid in varchar2)
return varchar2
is
ls_my_rowid varchar2(200);
rowid_type number;
object_number number;
relative_fno number;
block_number number;
row_number number;
begin
dbms_rowid.rowid_info(l_rowid,rowid_type,object_number,relative_fno, block_number, row_number);
ls_my_rowid := 'Object# is :'||to_char(object_number)||chr(10)||
'Relative_fno is :'||to_char(relative_fno)||chr(10)||
'Block number is :'||to_char(block_number)||chr(10)||
'Row number is :'||to_char(row_number);
return ls_my_rowid ;
end;
select get_rowid('AAASheAAEAAAAIOAAB') from dual;
六、索引的分類
B樹索引
通用索引、默認的索引類型,最多能夠包括 32 列。索引列的值都存儲在索引中。當索引列的值知足
查詢時就不用從表中查詢;B 樹索引的索引值中包含 ROWID ,這樣 Oracle 就能夠在行級別上鎖定索引。
Oracle不會對索引列上包含 NULL 值的行進行索引。樹葉塊包含了索引值、ROWID,以及指向前一個和後
一個樹葉塊的指針。
特色:
適合與大量的增、刪、改(OLTP )
不能用包含OR 操做符的查詢,CBO優化器OR操做不走索引
適合高基數的列(惟一值多)
位圖索引
很是適合於決策支持系統(Decision Support System , DSS) 和數據倉庫,位圖索引存儲爲壓縮的索
引值,其中包含了必定範圍的 ROWID ,所以 Oracle 必須針對一個給定值鎖定全部範圍內的 ROWID 。這
種鎖定類型可能在某些 DML 語句中形成死鎖。列中包含了很是多的重複值,不多UPDATE操做,最多30列
特色:
適合與決策支持系統;
作UPDATE 代價很是高;
很是適合OR 操做符的查詢;
基數比較少的時候才能建位圖索引;
HASH索引
使用HASH索引必需要使用HASH集羣。
索引組織表
把表的存儲結構改爲B樹結構,以表的主鍵進行排序。
反轉鍵索引
磁盤容量有限,同時還要執行大量的有序載入,就可使用反轉鍵索引
基於函數的索引
create index EMP$UPPER_JOB on emp(UPPER(job));
分區索引
就是簡單地把一個索引分紅多個片段。能夠訪問更小的片段( 也更快 ) ,B樹和位圖索引均可以被
分區,而HASH索引不能夠被分區。表被分區而索引未被分區;表未被分區而索引被分區;表和索引都被
分區。分區可以提供更多能夠提升性能和可維護性的可能性,用分區後的表和索引時,Oracle還支持並
行查詢和並行DML。
本地分區索引
使用與表相同的分區鍵和範圍界限來對本地索引分區。本地索引能夠是B樹或位圖索引,當表的分
區發生變化時,索引的維護由Oracle自動進行。局部索引只支持分區內的惟一性,沒法支持表上的惟一
性,所以若是要用局部索引去給表作惟一性約束,則約束中必需要包括分區鍵列。
create index ix_custaddr_local_id on custaddr(id) local;
有前綴索引:指包含了分區鍵,而且將其做爲引導列的索引。
無前綴索引:索引的列不是以分區鍵開頭,或者不包含分區鍵列。
全局分區索引
能夠選擇是否分區,並且索引的分區能夠不與表分區相對應。全局分區索引只能是B樹索引,到目
前爲止(10gR2),oracle只支持有前綴的全局索引。oracle不會自動的維護全局分區索引,當咱們在對
表的分區作修改時能夠加上update global indexes,或者執行完操做後 REBUILD。oracle只支持
range partitioned 和 Hash Partitioned.2中類型的全局分區索引
全局索引,全局索引對全部分區類型都支持:全局分區索引,只支持Range 分區和Hash 分區:
表用a列做分區,索引用b作局部分區索引,若where條件中用b來查詢,那麼oracle會掃描全部的表和
索引的分區,成本會比分區更高,此時能夠考慮用b作全局分區索引。
參考資料:
http://www.2cto.com/database/201110/107271.html
http://www.cnblogs.com/flowerszhong/p/4535206.html函數
什麼是彙集索引,什麼是非彙集索引,什麼又是主鍵?
彙集索引肯定表中數據的物理順序。彙集索引規定數據在表中的物理存儲順序,一個表只能包含一個彙集
索引,但該索引能夠包含多個列。彙集索引對於搜索範圍值的列特別有效。從表中檢索的數據進行排序時能夠
將該表在該列上建立彙集索引,提升性能。
非彙集索引是,索引與數據物理存儲分開,索引帶有指針指向數據的存儲位置。索引和表按本身的值排序
多用於包含大量非重複值的列,返回精確匹配的查詢。
PRIMARY KEY 約束表中一個列或列的組合,其值能惟一地標識表中的每一行。經過它可強制表的實體完整性。
http://blog.sina.com.cn/s/blog_7e662b4a01012cx6.html 工具