點陣圖索引(Bitmap Index)——索引共用
點陣圖索引區別於傳統B*樹索引有兩個結構特點:其一是葉子節點上是一個可能的索引列取值對應一個葉子節點。另一個就是葉子節點上透過一個點陣圖向量表示對應行是否取定這個索引值。
使用點陣圖向量記錄對應行的取值情況不僅可以帶來儲存空間上的節省,而且可以藉助計算機點陣圖運算的快速特性來提高索引結果利用率。下面我們透過模擬情況來進行分析。
Bitmap Index模擬說明
假設存在資料表T,有兩個資料列A和B,取值如下。
序號 |
A |
B |
1 |
L |
1 |
2 |
T |
2 |
3 |
L |
2 |
4 |
M |
1 |
對兩個資料列A、B分別建立點陣圖索引:idx_t_bita和idx_t_bitb。兩個索引對應的儲存邏輯結構如下:
Idx_t_bita索引結構,對應的是葉子節點:
索引鍵值 |
起始rowid |
結束rowid |
點陣圖向量 |
L |
xxx |
ttt |
1010 |
T |
xxx |
ttt |
0100 |
M |
xxx |
ttt |
0001 |
Idx_t_bitb索引結構,對應的是葉子節點:
索引鍵值 |
起始rowid |
結束rowid |
點陣圖向量 |
1 |
xxx |
ttt |
1001 |
2 |
xxx |
ttt |
0110 |
|
|
|
|
對查詢“select * from t where b=1 and (a=’L’ or a=’M’)”
分析:點陣圖索引使用方面,和B*索引有很大的不同。B*索引的使用,通常是從根節點開始,經過不斷的分支節點比較到最近的符合條件葉子節點。透過葉子節點上的不斷Scan操作,“掃描”出結果集合rowid。
而點陣圖索引的工作方式截然不同。透過不同點陣圖取值直接的位運算(與或),來獲取到結果集合向量(計算出的結果)。
針對例項SQL,可以拆分成如下的操作:
1、a=’L’ or a=’M’
a=L:向量:1010
a=M:向量:0001
or操作的結果,就是兩個向量的或操作:結果為1011。
2、結合b=1的向量
中間結果向量:1011
B=1:向量:1001
and操作的結果,1001。翻譯過來就是第一和第四行是查詢結果。
3、獲取到結果rowid
目前知道了起始rowid和終止rowid,以及第一行和第四行為操作結果。可以透過試算的方法獲取到結果集合rowid。
上面的操作演算過程,說明了兩個問題:
點陣圖索引是可以多索引共同合作操作的,不像B*樹索引只有一個會加入結果集合;
點陣圖索引的工作是透過位邏輯運算,非掃描操作;
實際試驗
下面我們透過一系列的實驗,來進一步觀察結果。
實驗環境構建
SQL> create table t as select owner owner1, object_type type1, owner owner2, object_type type2 from dba_objects;
Table created
SQL> desc t;
Name Type Nullable Default Comments
------ ------------ -------- ------- --------
OWNER1 VARCHAR2(30) Y
TYPE1 VARCHAR2(19) Y
OWNER2 VARCHAR2(30) Y
TYPE2 VARCHAR2(19) Y
SQL> create index idx_t_owner1 on t(owner1);
Index created
SQL> create index idx_t_type1 on t(type1);
Index created
SQL> create bitmap index idx_t_owner2bit on t(owner2);
Index created
SQL> create bitmap index idx_t_type2bit on t(type2);
Index created
SQL> exec dbms_stats.gather_table_stats(user,'T',cascade => true);
PL/SQL procedure successfully completed
常規索引實驗
我們構建的環境中,欄位和型別完全相同。區別就在於使用的索引型別差異。下面我們先進行常規索引實驗。
//為防止影響執行計劃,先禁用Bitmap Index
SQL> alter index idx_t_owner2bit unusable;
Index altered
SQL> alter index idx_t_type2bit unusable;
Index altered
SQL> set pagesize 1000;
SQL> set linesize 1000;
SQL> explain plan for select * from t where owner1='SCOTT' and type1='TABLE';
已解釋。
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------
Plan hash value: 2154532428
--------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time|
--------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 28 | 2 (0)| 00:00:01 |
|* 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 28 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_T_OWNER1 | 28 | | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("TYPE1"='TABLE')
2 - access("OWNER1"='SCOTT')
已選擇15行。
注意:owner1和type1上均有B*索引,而且均出現在where條件上。結果採用的Scan方式,而且只使用到了一個索引物件。
Bitmap Index索引實驗
此次使用Bitmap Index列對應查詢條件。
//索引處理
SQL> alter index idx_t_type2bit rebuild;
Index altered
SQL> alter index idx_t_owner2bit rebuild;
Index altered
SQL> alter index idx_t_owner1 unusable;
Index altered
SQL> alter index idx_t_type1 unusable;
Index altered
SQL> explain plan for select * from t where owner2='SCOTT' and type2='TABLE';
已解釋。
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------------------------
Plan hash value: 244872826
------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 61 | 1708 | 13 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID | T | 61 | 1708 | 13 (0)| 00:00:01 |
| 2 | BITMAP CONVERSION TO ROWIDS| | | | | |
| 3 | BITMAP AND | | | | | |
|* 4 | BITMAP INDEX SINGLE VALUE| IDX_T_TYPE2BIT | | | | |
|* 5 | BITMAP INDEX SINGLE VALUE| IDX_T_OWNER2BIT | | | | |
------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("TYPE2"='TABLE')
5 - access("OWNER2"='SCOTT')
已選擇18行。
在一個SQL中,兩個Bitmap索引均使用到。
下面實驗一個比較複雜的條件。
SQL> explain plan for select * from t where owner2='SCOTT' and (type2='TABLE' or type2='INDEX');
已解釋。
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------
Plan hash value: 3499411373
-------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 122 | 3416 | 24 (5)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID | T | 122 | 3416 | 24 (5)| 00:00:01 |
| 2 | BITMAP CONVERSION TO ROWIDS | | | | | |
| 3 | BITMAP AND | | | | | |
|* 4 | BITMAP INDEX SINGLE VALUE | IDX_T_OWNER2BIT | | | | |
| 5 | BITMAP OR | | | | | |
|* 6 | BITMAP INDEX SINGLE VALUE| IDX_T_TYPE2BIT | | | | |
|* 7 | BITMAP INDEX SINGLE VALUE| IDX_T_TYPE2BIT | | | | |
-------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
4 - access("OWNER2"='SCOTT')
6 - access("TYPE2"='INDEX')
7 - access("TYPE2"='TABLE')
已選擇21行。
請注意Bitmap系列and和or操作,和我們在開篇中做的模擬計算如出一轍。
Bitmap Index是一種適應範圍比較窄,但是特效針對性很強的索引型別。在一些場合下合適使用,可以帶來出乎意料的效果。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29067253/viewspace-2141758/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 點陣圖索引(Bitmap Index)——從B*樹索引到點陣圖索引索引Index
- oracle 點陣圖索引(bitmap index)Oracle索引Index
- 點陣圖索引:原理(BitMap index)索引Index
- 點陣圖索引(bitmap-index)索引Index
- bitmap index點陣圖索引系列(一)Index索引
- 點陣圖索引(Bitmap Index)——點陣圖索引與資料DML鎖定索引Index
- zt_深入理解bitmap index點陣圖索引Index索引
- 【Bitmap Index】B-Tree索引與Bitmap點陣圖索引的鎖代價比較研究Index索引
- 【索引】Bitmap點陣圖索引與普通的B-Tree索引鎖的比較索引
- Oracle索引——點陣圖索引Oracle索引
- oracle10g r2_sql tuning_bitmap index點陣圖索引_index效能小測試OracleSQLIndex索引
- B-Tree索引與Bitmap點陣圖索引的鎖代價比較研究索引
- 點陣圖索引.sql索引SQL
- 【基礎知識】索引--點陣圖索引索引
- 關於B*tree索引(index)的中度理解及bitmap 索引的一點探究(zt)索引Index
- Oracle-點陣圖索引Oracle索引
- 關於點陣圖索引的split及bitmap to rowid實現問題索引
- 【點陣圖索引】在點陣圖索引列上進行更新操作的鎖代價研究索引
- Python點陣圖索引學習Python索引
- 點陣圖索引的工作原理 - Richard索引
- B樹索引和點陣圖索引的結構介紹索引
- index索引Index索引
- [轉]:bitmap索引和B*tree索引分析索引
- BITMAP索引的INLIST ITERATOR與BITMAP OR索引
- 分割槽索引之本地(local index)索引和全域性索引(global index)索引Index
- 索引組織表上建立BITMAP索引(三)索引
- 索引組織表上建立BITMAP索引(二)索引
- 索引組織表上建立BITMAP索引(一)索引
- BITMAP索引異常增大索引
- oracle點陣圖索引對DML操作的影響Oracle索引
- 關於ORACLE點陣圖索引內部淺論Oracle索引
- Elasticsearch之索引模板index template與索引別名index aliasElasticsearch索引Index
- Mysql——index(索引)使用MySqlIndex索引
- oracle index索引原理OracleIndex索引
- mysql 索引( mysql index )MySql索引Index
- 加快建立索引(create / rebuild index) 的幾點索引RebuildIndex
- 教你如何成為Oracle 10g OCP - 第九章 物件管理(9) - 點陣圖(Bitmap)索引Oracle 10g物件索引
- 教你如何成為Oracle 10g OCP - 第九章 物件管理(10) - 點陣圖(Bitmap)索引Oracle 10g物件索引