4.位图索引的缺点(其它资料),也不好说是缺点

|
一.什么是位图索引 |
|
--先看没用索引的 SQL> explain plan for SELECT /*+NO_INDEX (A idx_b_khxx)*/ * FROM CRMII.TKHXX A WHERE YYB=7911 2 / Explained SQL> select * from table(dbms_xplan.display) 2 / PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value: 2975641408 --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 27884 | 7107K| 11337 (1)| 00:02:17 | |* 1 | TABLE ACCESS FULL| TKHXX | 27884 | 7107K| 11337 (1)| 00:02:17 | --------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("YYB"=7911) 13 rows selected --再看有用索引的 SQL> explain plan for select * from crmii.tkhxx where yyb=7911 2 / Explained SQL> select * from table(dbms_xplan.display) 2 / PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value: 1238075174 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 27884 | 7107K| 6862 (1)| | 1 | TABLE ACCESS BY INDEX ROWID | TKHXX | 27884 | 7107K| 6862 (1)| | 2 | BITMAP CONVERSION TO ROWIDS| | | | | |* 3 | BITMAP INDEX SINGLE VALUE | IDX_B_KHXX | | | | -------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - access("YYB"=7911) 15 rows selected --位图索引就是这么简单,首先更具单个键值找到对应的位图,然后把位图中的值转换为rowid,再根据rowid访问表格 --就以上这个情况来看,效率提升了大约100% |
|
CREATE TABLE TEST.TEST_BITMAP(ID INT,SCORE NUMBER); CREATE BITMAP INDEX TEST.IDX_B_TEST_BITMAP ON TEST.TEST_BITMAP(ID); INSERT INTO TEST.TEST_BITMAP VALUES(1,12); INSERT INTO TEST.TEST_BITMAP VALUES(1,13); INSERT INTO TEST.TEST_BITMAP VALUES(1,14); INSERT INTO TEST.TEST_BITMAP VALUES(1,15); INSERT INTO TEST.TEST_BITMAP VALUES(1,16); INSERT INTO TEST.TEST_BITMAP VALUES(1,17); INSERT INTO TEST.TEST_BITMAP VALUES(1,18); INSERT INTO TEST.TEST_BITMAP VALUES(1,19); INSERT INTO TEST.TEST_BITMAP SELECT ID+1,SCORE*2 FROM TEST.TEST_BITMAP; INSERT INTO TEST.TEST_BITMAP SELECT ID+1,LN(SCORE) FROM TEST.TEST_BITMAP; COMMIT; SQL> select count(*) from test.test_bitmap 2 / COUNT(*) ---------- 32 SQL> select header_file,header_block,blocks,bytes from dba_segments where segment_name='IDX_B_TEST_BITMAP' and owner='TEST' 2 / HEADER_FILE HEADER_BLOCK BLOCKS BYTES ----------- ------------ ---------- ---------- 205 1515 8 65536 SQL> ALTER SYSTEM DUMP DATAFILE 205 BLOCK MIN 1515 BLOCK MAX 1522 查看文件: row#0[7789] flag: ------, lock: 2, len=28 col 0; len 2; (2): c1 02 col 1; len 6; (6): 00 00 00 00 00 00 col 2; len 6; (6): 33 40 05 e8 00 07 col 3; len 8; (8): f8 c2 ca 88 f2 a9 02 ff row#1[7712] flag: ------, lock: 2, len=29 col 0; len 2; (2): c1 03 col 1; len 6; (6): 00 00 00 00 00 00 col 2; len 6; (6): 33 40 05 e8 00 17 col 3; len 9; (9): f9 c3 ca 88 f2 a9 02 ff ff row#2[7664] flag: ------, lock: 2, len=28 col 0; len 2; (2): c1 04 col 1; len 6; (6): 00 00 00 00 00 00 col 2; len 6; (6): 33 40 05 e8 00 1f col 3; len 8; (8): f8 c5 ca 88 f2 a9 02 ff 前文说col 0是 可以转为具体的键值,可以通过dbms_stats.convert_raw_value直接转,对于varchar2好像是这样, 但是对于int或者number则不是这样的。这得从数值的存储方式说起,有关数值存储可以看 http://www.linuxidc.com/Linux/2011-01/31375.htm col 0; len 2; (2): c1 02 这里c1转为10进制=to_number('c1','xxxx')=193, 02就是2 ,结果和dump(1)的 “Typ=2 Len=2: 193,2”后面相等,不过少了长度和类型。 |
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25270419/viewspace-1190861/ ,如需转载,请注明出处,否则将追究法律责任。