索引詳解
索引的概念
索引是一個可選的結構、與簇表和表相關聯,可以提高讀取資料的速度,可以在表的一列或多列上建立索引,索引直接指向包含所查詢值的行的位置,減少磁碟I/O,與索引的表時相互獨立的物理結構,Oracle自動使用並維護索引,插入、刪除、更新表後,自動更新。如果堆表沒有索引,那麼資料庫必須執行全表掃描來找到一個值
索引的建立語法
CREATE UNIUQE | BITMAP INDEX.
ON.
(|expression>ASC|DESC,
|expression>ASC|DESC,...)
TABLESPACE
STORAGE
LOGGING|NOLOGGING
COMPUTE STATISTICS
NOCOMPRESS|COMPRESS
NOSORT|REVERSE
PARTITION|GLOBAL PARTITION
相關說明
1)UNIQUE|BITMAP:指定UNIQUE為唯一索引,BITMAP為點陣圖索引,省略為B-Tree索引。
2)>|expression>ASC|DESC:可以對多列進行聯合索引,當為expression時即“基於函式的索引”
3)TABLESPACE:指定存放索引的表空間(索引和原表不在一個表空間時效率更高)
4)STORAGE:設定表空間的儲存引數
5)LOGGING | NOLOGGING:是否對索引產生重做日誌 (對大表儘量使用NOLOGGING來減少佔用空間並提高效率 )
6)COMPUTE STATISTICS:建立新索引時收集統計資訊
7)NOCOMPRESS|COMPRESS:是否使用“鍵壓縮”(使用鍵壓縮可以刪除一個鍵列中出現的重複值)
8)NOSORT|REVERSE:NOSORT表示與表中相同的順序建立索引,REVERSE表示相反順序儲存索引值
9)PARTITION|NOPARTITION:可以在分割槽表和未分割槽表上對建立索引進行分割槽
索引的特點:
1)透過建立唯一性索引,可以保證資料庫表中的每一行資料的唯一性
2)可以大大加快資料的檢索速度,
3)可以加速表和表之間的連線,特別是在實現資料的參考完整性
4)使用分組和排序子句進行資料檢索時,可以減少查詢中分組和排序的時間
5)透過使用索引,在查詢過程中,使用最佳化隱藏器,提高系統的效能。
索引不足
1)建立和維護索引要耗費時間,這種時間隨著資料量的增加而增加
2)索引需要佔物理空間,除了資料表佔資料空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,需要的空間更大
3)當對錶中的資料進行增加、刪除、修改的時候,索引要動態維護,降低了資料的維護速度。
建立索引列的特點
1)經常需要搜尋的列
2)作為主鍵的列,強制該列的唯一性和組織表中資料的排列結構
3)經常用在連線的列上,加速連線
4)經常根據範圍進行搜尋的列上建立索引,因為索引已經排序,其指定的範圍是連續的
5)經常需啊喲排序的列上建立索引,因為索引已經排序,查詢可以利用索引的排序,加快排序查詢時間
6)經常使用在WHERE子句中的列上建立索引,加快條件判斷速度。
不應該建立索引列的特點
1)在查詢中很少使用或者參考的列不應該建立索引
2)只有很少資料值的列
3)對於定義為blob資料型別的列不應該增加索引
4)修改效能遠遠大於檢索效能時
限制索引
1)使用不等於運算子(<>,!=)
2)使用IS NULL 或 IS NOT NULL 如果索引列在某些行中存在NULL值,就不會使用這個索引(不包括點陣圖索引)
3)使用函式,如果不使用基於函式的索引,那麼在SQL語句的WHERE子句中對存在的索引的列使用函式時,會使最佳化器忽略掉這些索引。
4)比較不匹配的資料型別
例:abc_number是一個varchar2型別,在abc_number欄位上有索引。
下面語句將執行全表掃描:
select a,b,c,d,e from A where abc_number=123456;
Oracle會自動把where子句變成to_number(abc_number)=123456
限制了索引的使用,改為以下查詢可以使用索引:
select a,b,c,d,e from A where abc_number='123456';
不匹配的資料型別之間比較會讓Oracle自動限制索引的使用
查詢索引:DBA_INDEXES, USER_INDEXES, USER_IND_COLUMNS
Oracle rowid
Oracle透過每個行的rowid,Oracle索引提供了訪問單行資料的能力,ROWID直接指向單獨行的線路圖
SQL> select rowid from dual;
ROWID
------------------
AAAAEC AAB AAAAgi AAA
rowid=物件編號(6)+檔案編號(3)+塊編號(6)+ 行編號(3)=18位
ROWID的格式如下:
物件編號 檔案編號 塊編號 行編號
AAAAEC AAB AAAAgi AAA
索引分類
B樹索引(預設型別)
點陣圖索引
HASH索引
索引組織表索引
反轉鍵(reverse key)索引
基於函式的索引
分割槽索引
點陣圖連線索引
B樹索引(預設型別)
B樹索引在 Oracle中是一個通用索引。 在建立時它就預設的型別。B樹索 引可以是一個列的(簡單)索引,也可以是組合/複合(多個列)索引。 B樹索引最多可以包括 32列
B樹索引包括樹枝塊和樹葉塊
樹枝塊:包含鏈中下一個塊的ID號
樹葉塊:包含了索引值、ROWID、以及指向前一個和後一個樹葉塊的指標。
下圖為B樹索引的結構圖,
B-tree特點:
適合與大陸的增、刪、改(OLTP)
不能用包含OR運算子的查詢
適合高基數的列(唯一值多)
典型的樹狀結構
每個節點都是資料塊
點陣圖索引
點陣圖索引適用於離散度較低的列,它的葉塊中存放key, start rowid-end rowid,並應用一個函式把點陣圖中相應key值置1,點陣圖索引在邏輯or時效率最高。
例:
SQL>create bitmap index job_bitmap on emp1(job);
值/行 1 2 3 4 5 6 7 8 9 10 11 12 13 14
---------------------------------------------------------------
ANALYST 0 0 0 0 0 0 0 1 0 0 0 0 1 0
CLERK 1 0 0 0 0 0 0 0 0 0 1 1 0 1
MANAGER 0 0 0 1 0 1 1 0 0 0 0 0 0 0
PRESIDENT 0 0 0 0 0 0 0 0 1 0 0 0 0 0
SALESMAN 0 1 1 0 1 0 0 0 0 0 0 0 0 0
SQL>select count(*) from emp1 where job = 'CLERK' or job = 'MANAGER';
值/行 1 2 3 4 5 6 7 8 9 10 11 12 13 14
-----------------------------------------------------------------------------
CLERK 1 0 0 0 0 0 0 0 0 0 1 1 0 1
MANAGER 0 0 0 1 0 1 1 0 0 0 0 0 0 0
-----------------------------------------------------------------------------
or的結果 1 0 0 1 0 1 1 0 0 0 1 1 0 1
常用的B樹索引型別:
唯一或非唯一索引(Unique or non_unique): 唯一索引指鍵值不重複。
SQL> create unique index empno_idx on emp1(empno);
或
SQL> create index empno_idx on emp1(empno);
組合索引(Composite):繫結了兩個或更多列的索引。
SQL> create index job_deptno_idx on emp1(job,deptno);
反向鍵索引(Reverse):將位元組倒置後組織鍵值。當使用序列產生主鍵索引時,可以防止葉節點出現熱塊現象(考點)。
SQL> create index mgr_idx on emp1(mgr) reverse;
函式索引(Function base):以索引列值的函式值為鍵值去組織索引
SQL> create index fun_idx on emp1(lower(ename));
壓縮(Compress):重複鍵值只儲存一次,就是說重複的鍵值在葉塊中就存一次,後跟所有與之匹配的rowid字串。
SQL> create index comp_idx on emp1(sal) compress;
升序或降序(Ascending or descending):葉節點中的鍵值排列預設是升序的。
SQL> create index deptno_job_idx on emp1(deptno desc, job asc);
可以更改索引屬性:
alter index xxx ....
索引相關的資料字典
USER_INDEXES //索引主要資訊
USER_IND_CULUMNS //索引列的資訊
索引是一個可選的結構、與簇表和表相關聯,可以提高讀取資料的速度,可以在表的一列或多列上建立索引,索引直接指向包含所查詢值的行的位置,減少磁碟I/O,與索引的表時相互獨立的物理結構,Oracle自動使用並維護索引,插入、刪除、更新表後,自動更新。如果堆表沒有索引,那麼資料庫必須執行全表掃描來找到一個值
索引的建立語法
CREATE UNIUQE | BITMAP INDEX
ON
(
TABLESPACE
STORAGE
LOGGING|NOLOGGING
COMPUTE STATISTICS
NOCOMPRESS|COMPRESS
NOSORT|REVERSE
PARTITION|GLOBAL PARTITION
相關說明
1)UNIQUE|BITMAP:指定UNIQUE為唯一索引,BITMAP為點陣圖索引,省略為B-Tree索引。
2)
3)TABLESPACE:指定存放索引的表空間(索引和原表不在一個表空間時效率更高)
4)STORAGE:設定表空間的儲存引數
5)LOGGING | NOLOGGING:是否對索引產生重做日誌 (對大表儘量使用NOLOGGING來減少佔用空間並提高效率 )
6)COMPUTE STATISTICS:建立新索引時收集統計資訊
7)NOCOMPRESS|COMPRESS
8)NOSORT|REVERSE:NOSORT表示與表中相同的順序建立索引,REVERSE表示相反順序儲存索引值
9)PARTITION|NOPARTITION:可以在分割槽表和未分割槽表上對建立索引進行分割槽
索引的特點:
1)透過建立唯一性索引,可以保證資料庫表中的每一行資料的唯一性
2)可以大大加快資料的檢索速度,
3)可以加速表和表之間的連線,特別是在實現資料的參考完整性
4)使用分組和排序子句進行資料檢索時,可以減少查詢中分組和排序的時間
5)透過使用索引,在查詢過程中,使用最佳化隱藏器,提高系統的效能。
索引不足
1)建立和維護索引要耗費時間,這種時間隨著資料量的增加而增加
2)索引需要佔物理空間,除了資料表佔資料空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,需要的空間更大
3)當對錶中的資料進行增加、刪除、修改的時候,索引要動態維護,降低了資料的維護速度。
建立索引列的特點
1)經常需要搜尋的列
2)作為主鍵的列,強制該列的唯一性和組織表中資料的排列結構
3)經常用在連線的列上,加速連線
4)經常根據範圍進行搜尋的列上建立索引,因為索引已經排序,其指定的範圍是連續的
5)經常需啊喲排序的列上建立索引,因為索引已經排序,查詢可以利用索引的排序,加快排序查詢時間
6)經常使用在WHERE子句中的列上建立索引,加快條件判斷速度。
不應該建立索引列的特點
1)在查詢中很少使用或者參考的列不應該建立索引
2)只有很少資料值的列
3)對於定義為blob資料型別的列不應該增加索引
4)修改效能遠遠大於檢索效能時
限制索引
1)使用不等於運算子(<>,!=)
2)使用IS NULL 或 IS NOT NULL 如果索引列在某些行中存在NULL值,就不會使用這個索引(不包括點陣圖索引)
3)使用函式,如果不使用基於函式的索引,那麼在SQL語句的WHERE子句中對存在的索引的列使用函式時,會使最佳化器忽略掉這些索引。
4)比較不匹配的資料型別
例:abc_number是一個varchar2型別,在abc_number欄位上有索引。
下面語句將執行全表掃描:
select a,b,c,d,e from A where abc_number=123456;
Oracle會自動把where子句變成to_number(abc_number)=123456
限制了索引的使用,改為以下查詢可以使用索引:
select a,b,c,d,e from A where abc_number='123456';
不匹配的資料型別之間比較會讓Oracle自動限制索引的使用
查詢索引:DBA_INDEXES, USER_INDEXES, USER_IND_COLUMNS
Oracle rowid
Oracle透過每個行的rowid,Oracle索引提供了訪問單行資料的能力,ROWID直接指向單獨行的線路圖
SQL> select rowid from dual;
ROWID
------------------
AAAAEC AAB AAAAgi AAA
rowid=物件編號(6)+檔案編號(3)+塊編號(6)+ 行編號(3)=18位
ROWID的格式如下:
物件編號 檔案編號 塊編號 行編號
AAAAEC AAB AAAAgi AAA
索引分類
B樹索引(預設型別)
點陣圖索引
HASH索引
索引組織表索引
反轉鍵(reverse key)索引
基於函式的索引
分割槽索引
點陣圖連線索引
B樹索引(預設型別)
B樹索引在 Oracle中是一個通用索引。 在建立時它就預設的型別。B樹索 引可以是一個列的(簡單)索引,也可以是組合/複合(多個列)索引。 B樹索引最多可以包括 32列
B樹索引包括樹枝塊和樹葉塊
樹枝塊:包含鏈中下一個塊的ID號
樹葉塊:包含了索引值、ROWID、以及指向前一個和後一個樹葉塊的指標。
下圖為B樹索引的結構圖,
B-tree特點:
適合與大陸的增、刪、改(OLTP)
不能用包含OR運算子的查詢
適合高基數的列(唯一值多)
典型的樹狀結構
每個節點都是資料塊
點陣圖索引
點陣圖索引適用於離散度較低的列,它的葉塊中存放key, start rowid-end rowid,並應用一個函式把點陣圖中相應key值置1,點陣圖索引在邏輯or時效率最高。
例:
SQL>create bitmap index job_bitmap on emp1(job);
值/行 1 2 3 4 5 6 7 8 9 10 11 12 13 14
---------------------------------------------------------------
ANALYST 0 0 0 0 0 0 0 1 0 0 0 0 1 0
CLERK 1 0 0 0 0 0 0 0 0 0 1 1 0 1
MANAGER 0 0 0 1 0 1 1 0 0 0 0 0 0 0
PRESIDENT 0 0 0 0 0 0 0 0 1 0 0 0 0 0
SALESMAN 0 1 1 0 1 0 0 0 0 0 0 0 0 0
SQL>select count(*) from emp1 where job = 'CLERK' or job = 'MANAGER';
值/行 1 2 3 4 5 6 7 8 9 10 11 12 13 14
-----------------------------------------------------------------------------
CLERK 1 0 0 0 0 0 0 0 0 0 1 1 0 1
MANAGER 0 0 0 1 0 1 1 0 0 0 0 0 0 0
-----------------------------------------------------------------------------
or的結果 1 0 0 1 0 1 1 0 0 0 1 1 0 1
常用的B樹索引型別:
唯一或非唯一索引(Unique or non_unique): 唯一索引指鍵值不重複。
SQL> create unique index empno_idx on emp1(empno);
或
SQL> create index empno_idx on emp1(empno);
組合索引(Composite):繫結了兩個或更多列的索引。
SQL> create index job_deptno_idx on emp1(job,deptno);
反向鍵索引(Reverse):將位元組倒置後組織鍵值。當使用序列產生主鍵索引時,可以防止葉節點出現熱塊現象(考點)。
SQL> create index mgr_idx on emp1(mgr) reverse;
函式索引(Function base):以索引列值的函式值為鍵值去組織索引
SQL> create index fun_idx on emp1(lower(ename));
壓縮(Compress):重複鍵值只儲存一次,就是說重複的鍵值在葉塊中就存一次,後跟所有與之匹配的rowid字串。
SQL> create index comp_idx on emp1(sal) compress;
升序或降序(Ascending or descending):葉節點中的鍵值排列預設是升序的。
SQL> create index deptno_job_idx on emp1(deptno desc, job asc);
可以更改索引屬性:
alter index xxx ....
索引相關的資料字典
USER_INDEXES //索引主要資訊
USER_IND_CULUMNS //索引列的資訊
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28282660/viewspace-1385724/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL索引詳解MySql索引
- Postgres索引詳解索引
- InnoDB 索引詳解索引
- MySQL 索引詳解MySql索引
- oracle索引詳解 分割槽索引Oracle索引
- MongoDB索引優化詳解MongoDB索引優化
- MongoDB複合索引詳解MongoDB索引
- MongoDB索引與優化詳解MongoDB索引優化
- MYSQL學習(三) --索引詳解MySql索引
- 最全面的 MySQL 索引詳解MySql索引
- MySQL的InnoDB索引原理詳解MySql索引
- Elasticsearch 索引的對映配置詳解Elasticsearch索引
- 快速掌握mongoDB(三)——mongoDB的索引詳解MongoDB索引
- 【INDEX】Oracle分割槽索引技術詳解IndexOracle索引
- Oracle中組合索引的使用詳解Oracle索引
- 效能調優-Mysql索引資料結構詳解與索引優化MySql索引資料結構優化
- 達夢資料庫索引結構詳解資料庫索引
- phoenix全域性索引和本地索引 概述,使用場景,區別等詳解索引
- MySQ索引操作命令總結(建立、重建、查詢和刪除索引命令詳解)索引
- 小白也能懂的Mysql資料庫索引詳解MySql資料庫索引
- NumPy 陣列建立方法與索引訪問詳解陣列索引
- 一文詳解 OceanBase 2.0 的“全域性索引”功能索引
- MySQL資料庫索引以及失效場景詳解DELNMySql資料庫索引
- MySQL中的索引詳講MySql索引
- Mysql探索之索引詳解,又能和麵試官互扯了~MySql索引
- Mysql系列第二十一講 mysql索引原理詳解MySql索引
- Mysql系列第二十二講 mysql索引管理詳解MySql索引
- 圖解MySQL索引(三)—如何正確使用索引?圖解MySql索引
- MySQL索引機制(詳細+原理+解析)MySql索引
- SQL Server 索引結構詳述(1)SQLServer索引
- 資料庫索引:綜合詳細指南資料庫索引
- (摘)sql-索引的作用(超詳細)SQL索引
- 資料庫的聚集索引和非聚集索引 很好的詳細說明資料庫索引
- 深入瞭解MySQL的索引MySql索引
- 解讀Oracle 索引掃描Oracle索引
- 字首索引,一種優化索引大小的解決方案索引優化
- 分散式架構篇|一文詳解 OceanBase 2.0 的“全域性索引”功能分散式架構索引
- ybtoj高效進階題解索引索引