點陣圖索引(bitmap-index)
點陣圖索引(bitmap-index)
點陣圖索引概念
點陣圖索引適合於(low cardinality)的情況,即column中只有很少部分的值是不同的。點陣圖索引類似一個二維的陣列,列代表的是column不同的取值,行代表某條記錄的取值。1所在的位置表示某條記錄在該列取什麼值。如下圖:
create bitmap index person_region on person (region);
Row Region North East West South
1 North 1 0 0 0
2 East 0 1 0 0
3 West 0 0 1 0
4 West 0 0 1 0
5 South 0 0 0 1
6 North 1 0 0 0
Row Region North East West South
1 North 1 0 0 0
2 East 0 1 0 0
3 West 0 0 1 0
4 West 0 0 1 0
5 South 0 0 0 1
6 North 1 0 0 0
row1 在region 列的值是North,所以在點陣圖中North列的位置是1.
點陣圖索引的使用注意事項
點陣圖索引對使用複合條件(and,or)的查詢語句非常有用。因為點陣圖可以很方便的進行這些運算。點陣圖索引所帶來的查詢效能上的優勢會被DML操作效能的降低所抵消(修改點陣圖索引所花費的開銷要比平衡樹索引大),所以點陣圖索引更適合DML操作比較少的OLAP(資料倉儲)環境下。而且在高DML的環境下點陣圖索引很容易引起死鎖。
另外點陣圖索引具有高可壓縮的結構,這樣讀取點陣圖索引的速度為非常的快,但是卻需要更多的CPU資源來解壓縮點陣圖索引,所有需要在IO開銷,CPU開銷,儲存開銷方面做出選擇或者平衡。
模擬bitmap index 環境下死鎖的出現
session 1
SQL> select sid from V$mystat where rownum = 1;
SID
----------
1
SQL> create table test_bitmap
2 (field varchar2(5));
Table created.
SQL> create bitmap index test_bitmap_idx on test_bitmap(field);
Index created.
SQL> insert into test_bitmap
2 values ('F');
1 row created.
session 2
SQL> select sid from V$mystat where rownum = 1;
SID
----------
30
SQL> insert into test_bitmap
2 values('T');
1 row created.
SQL> insert into test_bitmap
2 values('F');
#執行完這些語句後,去session 1執行 另外一條insert語句。
insert into test_bitmap
*
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource
session 1
SQL> insert into test_bitmap
2 values('T');
^Cinsert into test_bitmap
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation
該insert 語句會一直等待,所以我取消了。
session1 插入記錄以後點陣圖如下,同時session1 鎖定了bit-map index中的F值列。
row field F
1 F 1
session2 第一次插入記錄以後點陣圖如下,同時session2 鎖定了bit-map index中的T值列。
row field F T
1 F 1 0
2 T 0 1
session2 第二次插入記錄以後理想情況下點陣圖是下面這樣子的,但是因為session1 鎖住了bit-map index中的F值列,所以session 2 卡在那邊,一直在waiting。。。。請求session1 的鎖。
row field F T
1 F 1 0
2 T 0 1
3 F 1 0
現在在session1 中發出的語句請求session 2的鎖。這時候資源請求的迴圈鏈構成了,出現死鎖oracle 探測到並報錯。
row field F T
1 F 1 0
2 T 0 1
3 F 1 0
4 T 0 1
注:紅色部分實際上並不存在於點陣圖索引中,是為了說明理想情況下應該存在而引入的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26110315/viewspace-720662/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 點陣圖索引(轉載)索引
- Python點陣圖索引學習Python索引
- 點陣圖索引的工作原理 - Richard索引
- oracle點陣圖索引對DML操作的影響Oracle索引
- 點陣圖
- MySQL點陣圖索引解決使用者畫像問題MySql索引
- ClickHouse 留存、路徑、漏斗、session 點陣圖 roaringbitmap 點陣圖最佳化Session
- MySQL點陣圖索引解決使用者畫像問題(簡化建立流程)MySql索引
- PHP 文字生成點陣圖PHP
- Redis 應用-點陣圖Redis
- 點陣圖字型匯入
- 可寫點陣圖(WriteableBitmap)
- PHP掃描圖片轉點陣 二維碼轉點陣PHP
- Android Bitmap(點陣圖)詳解Android
- 演算法-點陣圖排序演算法排序
- 點陣圖與ERP場景
- 代理模式+react+ 圖片佔點陣圖模式React
- 點陣圖(bitmap)原理以及實現
- layui圖片懶載入-loading佔點陣圖UI
- hash join構建點陣圖的理解
- VC 點陣圖按鈕CBitmapButton的使用
- 雜湊表擴充套件—點陣圖套件
- DM7 陣列索引陣列索引
- Oracle assm三級點陣圖結構解析OracleSSM
- Android實現二值點陣圖識別Android
- 尋找陣列的中心索引陣列索引
- DM8管理陣列索引陣列索引
- UITableView佔點陣圖的低耦合性設計UIView
- 如何優雅地使用Redis之點陣圖操作Redis
- FreeType Glyph Conventions 翻譯(7)——FreeType點陣圖 Bitmaps
- Redis 精確去重計數 —— 咆哮點陣圖Redis
- 點亮點陣以及點陣的影像顯示
- 標籤列印軟體中如何迴圈列印點陣圖圖片
- JavaScript 陣列 指定索引位置插入元素JavaScript陣列索引
- 第六篇 numpy陣列索引陣列索引
- 如何在 bash 中使用索引陣列索引陣列
- 優先順序點陣圖演算法詳解演算法
- Java-GUI程式設計之處理點陣圖JavaGUI程式設計
- 圖解MySQL索引(三)—如何正確使用索引?圖解MySql索引