bitmap index點陣圖索引系列(一)
bitmap index
1,bitmap index為每個過資訊化鍵儲存一個點陣圖,而在b-tree index中,一個索引條目對應一條記錄;
但對點陣圖索引條目(或鍵值)卻指向多條記錄
2,bitmap index適用於dw和查詢引用多條列
低基數的列
3,點陣圖中每個bit對應不同的rowid.如配置了bit,相應的rowid對應的記錄會包括這個鍵值.
4,oracle有個對映函式把特定位置上的bit轉化為實際的rowid.
5,bitmap index和b-tree index實現相同的功能,但採用不同的實現
6,如果更新某一行的索引列時,資料庫鎖住索引鍵值條目(比如性別列:男,女),
上面說了,點陣圖索引每個鍵對應多條記錄.所以會一下鎖定多條記錄,所以點陣圖索引不適應大量的oltp
7,bitmap index可用於null的統計,而b-tree index則不能
8,sample bitmap
如一個表有3行記錄,且性別列建立點陣圖索引
性別列值:男,女
則採用2個點陣圖
每個點陣圖採用bit設定,配置為1或0對應男和女
如表有3條記錄則為:
點陣圖索引列的值 記錄1 記錄2 記錄3
男 1 0 1
女 0 1 0
然後oracle對映函式把上面點陣圖中的每個bit轉換為錶行對應的rowid
--點陣圖索引如索引列為null依舊可以走索引
SQL> explain plan for select count(sex) from t_detail where sex is null;
Explained
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2526431793
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CP
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 | 1 (
| 1 | SORT AGGREGATE | | 1 | 2 |
| 2 | BITMAP CONVERSION TO ROWIDS | | 3 | 6 | 1 ( --用oracle internal function轉化bitmap為rowid
|* 3 | BITMAP INDEX FAST FULL SCAN| IDX_T_DETAIL | | | --先掃描到點陣圖索引的索引塊
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - filter("SEX" IS NULL)
---bitmap join index
1,用於多表關聯
2,建立於單表之上
3,用於避免多表關聯產生的資料量或查詢成本;
4,示例:
SELECT COUNT(*)
FROM employees, jobs
WHERE employees.job_id = jobs.job_id
AND jobs.job_title = 'Accountant';
--可以建立bitmap join index
CREATE BITMAP INDEX employees_bm_idx
ON employees (jobs.job_title) --基於表employee但括號內卻是另一個join table的where條件即jobs.job_titile
FROM employees, jobs --bitmap join index的資料來源,即employees,jobs
WHERE employees.job_id = jobs.job_id; ---資料來源filter,即二表關聯列
bitmap join index的好處,不用再關聯二表因為上述索引已經具備這種資料了
bitmap join index在dw環境下,可用於代替join mv
--------------示例
--二表結構如下
SQL> desc emp;
Name Type Nullable Default Comments
----- ------------- -------- ------- --------
EMPNO INTEGER Y
ENAME VARCHAR2(100) Y
JOBNO INTEGER
SQL> desc job;
Name Type Nullable Default Comments
------- ------------- -------- ------- --------
JOBNO INTEGER Y
JOBNAME VARCHAR2(100) Y
--報錯因為維度表job(dw概念,即可以用連線列jobno唯一定位記錄的表,在此為job表,必須建立唯一索引或主鍵
SQL> create bitmap index idx_join_test on emp(job.jobname) from emp,job where emp.jobno=job.jobno;
create bitmap index idx_join_test on emp(job.jobname) from emp,job where emp.jobno=job.jobno
ORA-25954: missing primary key or unique constraint on dimension
SQL> alter table job add primary key(jobno);
Table altered
SQL> create bitmap index idx_join_test on emp(job.jobname) from emp,job where emp.jobno=job.jobno;
Index created
SQL> truncate table emp;
Table truncated
--對事實表,即與維度表相反,用連線列不能唯一確定表記錄的表,在此為emp表
SQL> alter table emp add primary key(jobno);
Table altered
--對事實表建立唯一索引無用
SQL> create bitmap index idx_join_test on emp(job.jobname) from emp,job where emp.jobno=job.jobno;
create bitmap index idx_join_test on emp(job.jobname) from emp,job where emp.jobno=job.jobno
ORA-25954: missing primary key or unique constraint on dimension
Bitmap join index的一些限制條件
只支援CBO
只能是equi-inner連線,任何外連線都無法使用bitmap join index
多個連線條件只能是AND關係
只能在fact table上執行並行DML。如果在dimension table上執行並行DML,會導致索引變為unusable狀態。
不同的事務中,只能併發更新一個表
在From字句中,任何一個表都不能出現兩次
在索引組織表(IOT)和臨時表上不能建立bitmap join index
索引只能基於dimenion table中的列
維度表用於連線的列只能是主鍵列或者是有唯一約束的列。
--使用bitmap join index的效果對比
--未使用執行計劃
SQL> explain plan for select count(emp.empno) from emp,job where emp.jobno=job.jobno and job.jobname='dba';
Explained
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3521430431
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 20 | 6 (17)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 20 | | |
|* 2 | HASH JOIN | | 1 | 20 | 6 (17)| 00:00:01 |
| 3 | TABLE ACCESS FULL| EMP | 1 | 13 | 2 (0)| 00:00:01 |
|* 4 | TABLE ACCESS FULL| JOB | 1 | 7 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("EMP"."JOBNO"="JOB"."JOBNO")
4 - filter("JOB"."JOBNAME"='dba')
17 rows selected
--建立bitmap join index之後執行計劃
SQL> alter table job add primary key(jobno);
Table altered
SQL> create bitmap index idx_join_test on emp(job.jobname) from emp,job where emp.jobno=job.jobno;
Index created
SQL> explain plan for select count(*) from emp,job where emp.jobno=job.jobno and job.jobname='dba';
Explained
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 1092048613
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 1 (0
| 1 | SORT AGGREGATE | | 1 | 13 |
| 2 | BITMAP CONVERSION COUNT | | 1 | 13 | 1 (0
|* 3 | BITMAP INDEX SINGLE VALUE| IDX_JOIN_TEST | | | --不用回表了,直接自bitmap join index獲取
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("EMP"."SYS_NC00004$"='dba')
15 rows selected
小記:但bitmap join index僅適用於dw
且select要是count,sum等,如非此,它就用不上了
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-756543/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 點陣圖索引(Bitmap Index)——索引共用索引Index
- oracle 點陣圖索引(bitmap index)Oracle索引Index
- 點陣圖索引:原理(BitMap index)索引Index
- 點陣圖索引(bitmap-index)索引Index
- 點陣圖索引(Bitmap Index)——從B*樹索引到點陣圖索引索引Index
- 點陣圖索引(Bitmap Index)——點陣圖索引與資料DML鎖定索引Index
- zt_深入理解bitmap index點陣圖索引Index索引
- 【Bitmap Index】B-Tree索引與Bitmap點陣圖索引的鎖代價比較研究Index索引
- oracle10g r2_sql tuning_bitmap index點陣圖索引_index效能小測試OracleSQLIndex索引
- 【索引】Bitmap點陣圖索引與普通的B-Tree索引鎖的比較索引
- 關於B*tree索引(index)的中度理解及bitmap 索引的一點探究(zt)索引Index
- B-Tree索引與Bitmap點陣圖索引的鎖代價比較研究索引
- Oracle索引——點陣圖索引Oracle索引
- Android Bitmap(點陣圖)詳解Android
- 點陣圖(bitmap)原理以及實現
- 點陣圖索引.sql索引SQL
- 關於點陣圖索引的split及bitmap to rowid實現問題索引
- Oracle-點陣圖索引Oracle索引
- 【基礎知識】索引--點陣圖索引索引
- PHP實現bitmap點陣圖排序求交集PHP排序
- Bitmap IndexIndex
- 【點陣圖索引】在點陣圖索引列上進行更新操作的鎖代價研究索引
- Linux 核心資料結構:點陣圖(Bitmap)Linux資料結構
- 【Google官方教程】第一課:高效地載入大Bitmap(點陣圖)Go
- bitmap join indexIndex
- CREATE BITMAP INDEXIndex
- Python點陣圖索引學習Python索引
- 點陣圖索引的工作原理 - Richard索引
- 索引組織表上建立BITMAP索引(一)索引
- b+ and bitmap indexIndex
- 教你如何成為Oracle 10g OCP - 第九章 物件管理(9) - 點陣圖(Bitmap)索引Oracle 10g物件索引
- 教你如何成為Oracle 10g OCP - 第九章 物件管理(10) - 點陣圖(Bitmap)索引Oracle 10g物件索引
- B樹索引和點陣圖索引的結構介紹索引
- B-tree and Bitmap IndexIndex
- BITMAP索引的INLIST ITERATOR與BITMAP OR索引
- oracle點陣圖索引對DML操作的影響Oracle索引
- 關於ORACLE點陣圖索引內部淺論Oracle索引
- oracle index索引結構(一)OracleIndex索引