[20150205]关于位图索引7.txt

简介: [20150205]关于位图索引7.txt --许多人知道在oltp系统不适合使用位图索引.它的索引的记录结构如下是: 字段0:键值 字段1:开始rowid 字段2:结束rowid 字段3:位图信息,指示那行记录,位图1=>表示存在.

[20150205]关于位图索引7.txt

--许多人知道在oltp系统不适合使用位图索引.它的索引的记录结构如下是:
字段0:键值
字段1:开始rowid
字段2:结束rowid
字段3:位图信息,指示那行记录,位图1=>表示存在.位图0=>表示不存在.

--但是字段4的位图信息,介绍的资料太少,我自己看了链接http://juliandyke.com/Presentations/BitmapIndexInternals.ppt,做一个简单探究.

--前面的blog已经讲解了字段3的位图信息编码.

--实际上我写第1篇时一直有一个疑问:
create table t(id number , name varchar2(10), status varchar2(1));
insert into t select rownum-1 id,dbms_random.string('X',10) c20,decode(mod((rownum-1),8),0,'Y','N') c1 from dual connect by levelcommit ;
create bitmap index ib_t_status on t(status);

--status='Y'的col3对应的是
col 3; len 9; (9):  cf 01 01 01 01 01 01 01 01
--为什么不使用单字节组 00 00 00 00 00 00 00 00 表示,而使用多字节组来表示,后面的编码更短.

--关于编码的算法oracle估计不公开,我也很难猜到.

--理论讲如果存在等效的编码,查询应该都不会有问题,自己做一个测试看看,不要在生产系统做这种事情,仅仅为了测试..

1.建立测试环境:

SCOTT@test> @ &r/ver1

PORT_STRING                    VERSION        BANNER
------------------------------ -------------- ----------------------------------------------------------------
x86_64/Linux 2.4.xx            10.2.0.4.0     Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi

create table t(id number , name varchar2(10), status varchar2(1));
insert into t select rownum-1 id,dbms_random.string('X',10) c20,decode(mod((rownum-1),8),1,'Y','N') c1 from dual connect by levelcommit ;

update t set status='N' where id=1;
commit ;

SCOTT@test> select rowid,t.* from t where status='Y';
ROWID                        ID NAME                 S
------------------ ------------ -------------------- -
AAAOWEAAEAAAAGNAAJ            9 T6CTE7UJ6O           Y
AAAOWEAAEAAAAGNAAR           17 WIFY6TEH4C           Y
AAAOWEAAEAAAAGNAAZ           25 O9RJEGYMGX           Y
AAAOWEAAEAAAAGNAAh           33 3XKLGNX6N3           Y
AAAOWEAAEAAAAGNAAp           41 IXNYY8QBBK           Y
AAAOWEAAEAAAAGNAAx           49 36VZP9HSOX           Y
AAAOWEAAEAAAAGNAA5           57 8QWGRDX8OV           Y

7 rows selected.

SCOTT@test> @ &r/lookup_rowid AAAOWEAAEAAAAGNAAJ
      OBJECT         FILE        BLOCK          ROW DBA                  TEXT
------------ ------------ ------------ ------------ -------------------- ----------------------------------------
       58756            4          397            9 4,397                alter system dump datafile 4 block 397 ;

create bitmap index ib_t_status on t(status);

SCOTT@test> select owner,segment_name,header_file,header_block  from dba_segments where owner=user and segment_name='IB_T_STATUS';
OWNER  SEGMENT_NAME          HEADER_FILE HEADER_BLOCK
------ -------------------- ------------ ------------
SCOTT  IB_T_STATUS                     4          403

2.转储索引块:
SCOTT@test> alter system checkpoint ;
System altered.

SCOTT@test> alter system dump datafile 4 block 404;
System altered.

row#0[8004] flag: ------, lock: 0, len=28
col 0; len 1; (1):  4e
col 1; len 6; (6):  01 00 01 8d 00 00
col 2; len 6; (6):  01 00 01 8d 00 3f
col 3; len 9; (9):  cf ff fd fd fd fd fd fd fd
row#1[7977] flag: ------, lock: 0, len=27
col 0; len 1; (1):  59
col 1; len 6; (6):  01 00 01 8d 00 08
col 2; len 6; (6):  01 00 01 8d 00 3f
col 3; len 8; (8):  ce 02 02 02 02 02 02 02
----- end of leaf block dump -----
End dump data blocks tsn: 4 file#: 4 minblk 404 maxblk 404

--看看status='Y'的col3编码:
col 0; len 1; (1):  59
col 1; len 6; (6):  01 00 01 8d 00 08
col 2; len 6; (6):  01 00 01 8d 00 3f
col 3; len 8; (8):  ce 02 02 02 02 02 02 02

--开始rowid01 00 01 8d 00 08.
--再做一次展开看看:
-- ce 拆开
-- 11 001 110
-- 11 大于192.表示Multi-Byte Groups
-- 001 表示 0个字节0
-- 110 表示7个字节长度.跟着6个字节表示位图.

--实际上如果我修改成如下也是对的,修改开始rowid为01 00 01 8d 00 00
col 0; len 1; (1):  59
col 1; len 6; (6):  01 00 01 8d 00 00
col 2; len 6; (6):  01 00 01 8d 00 3f
col 3; len 8; (8):  d6 02 02 02 02 02 02 02

-- d6 拆开
-- 11 010 110
-- 11 大于192.表示Multi-Byte Groups
-- 010 表示 1个字节0 (8个0)
-- 110 表示7个字节长度.跟着6个字节表示位图.

-- 主要这样修改保持等长,这样修改量比较小,不容易出错.

3.保险期间,修改关闭数据库,我使用bvi修改.
--404*8192=3309568

$  bvi -b 3309568 -s 8192 /mnt/ramdisk/test/users01.dbf

--修改完成后要注意使用bbed重写校验信息.
BBED> set dba 4,404
        DBA             0x01000194 (16777620 4,404)

BBED> sum apply
Check value for File 4, Block 404:
current = 0x14d7, required = 0x14d7

SYS@test> alter system dump datafile 4 block 404;
System altered.

row#0[8004] flag: ------, lock: 0, len=28
col 0; len 1; (1):  4e
col 1; len 6; (6):  01 00 01 8d 00 00
col 2; len 6; (6):  01 00 01 8d 00 3f
col 3; len 9; (9):  cf ff fd fd fd fd fd fd fd
row#1[7977] flag: ------, lock: 0, len=27
col 0; len 1; (1):  59
col 1; len 6; (6):  01 00 01 8d 00 00
col 2; len 6; (6):  01 00 01 8d 00 3f
col 3; len 8; (8):  d6 02 02 02 02 02 02 02
----- end of leaf block dump -----
End dump data blocks tsn: 4 file#: 4 minblk 404 maxblk 404

4.查询看看是否有效.
SCOTT@test> select count(*) from t where status='Y' ;
    COUNT(*)
------------
           7

SCOTT@test> @ &r/dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  7a1bzunu9aqat, child number 0
-------------------------------------
select count(*) from t where status='Y'

Plan hash value: 13930037

---------------------------------------------------------------------------
| Id  | Operation                     | Name        | E-Rows | Cost (%CPU)|
---------------------------------------------------------------------------
|   1 |  SORT AGGREGATE               |             |      1 |            |
|   2 |   BITMAP CONVERSION COUNT     |             |     32 |     1   (0)|
|*  3 |    BITMAP INDEX FAST FULL SCAN| IB_T_STATUS |        |            |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   3 - filter("STATUS"='Y')

--可以发现没有问题.

SCOTT@test> validate  index ib_t_status ;
Index analyzed.

SCOTT@test> @ &r/i
      HEIGHT       BLOCKS NAME             LF_ROWS      LF_BLKS  LF_ROWS_LEN   LF_BLK_LEN      BR_ROWS      BR_BLKS  BR_ROWS_LEN   BR_BLK_LEN  DEL_LF_ROWS DEL_LF_ROWS_LEN DISTINCT_KEYS
------------ ------------ ----------- ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ ------------ --------------- -------------
           1            8 IB_T_STATUS            2            1           59         7996            0            0            0            0            0               0             2

MOST_REPEATED_KEY  BTREE_SPACE   USED_SPACE     PCT_USED ROWS_PER_KEY BLKS_GETS_PER_ACCESS     PRE_ROWS PRE_ROWS_LEN OPT_CMPR_COUNT OPT_CMPR_PCTSAVE
----------------- ------------ ------------ ------------ ------------ -------------------- ------------ ------------ -------------- ----------------
                1         7996           59            1            1                    2            0            0              0                0

--可以发现这样修改没有问题.

目录
相关文章
|
SQL 测试技术 索引
[20180509]函数索引问题.txt
[20180509]函数索引问题.txt https://jonathanlewis.wordpress.com/2018/05/07/fbis-dont-exist/ --//重复测试: 1.
1125 0
|
关系型数据库 Linux 索引
[20180212]函数索引问题.txt
[20180212]函数索引问题.txt --//11g下,如果函数索引,字段出现重复,出现ORA-54015: Duplicate column expression was specified.
995 0
|
SQL Oracle 关系型数据库
[20171206]位图区一定在数据文件开头吗.txt
[20171206]位图区一定在数据文件开头吗.txt --//如果问你oracle数据文件的位图区位于数据文件开头部分吗?我想大家的回答一定,实际上在10g下未必,因为10g建立的数据文件.
1072 0
|
SQL 索引 物联网
位图索引(Bitmap Index)——索引共用
  位图索引区别于传统B*树索引有两个结构特点:其一是叶子节点上是一个可能的索引列取值对应一个叶子节点。另一个就是叶子节点上通过一个位图向量表示对应行是否取定这个索引值。
2902 0
|
存储 索引
|
物联网 索引
[20151008]索引组织表上创建BITMAP索引.txt
[20151008]索引组织表上创建BITMAP索引.txt --IOT 是一种特殊的索引结构,使用它能够解决特定场合的应用问题,但是在许多应用中很少使用,更多的是使用堆表。
955 0
|
测试技术 索引
[20150926]索引压缩问题.txt
[20150926]索引压缩问题.txt --以前如果索引前缀重复值很多,我会选择索引压缩,这样减少磁盘空间占用,索引范围扫描也可以减少磁盘IO,虽然这样可能消耗一些 --CUP资源,感觉影响不大。
897 0
|
SQL Oracle 关系型数据库
[20150803]使用函数索引注意的问题.txt
[20150803]使用函数索引注意的问题.txt --昨天在10g下优化时遇到一个奇怪的问题,做一个记录: --首先说明一下,最近一段时间在做一个项目的优化,这个项目实际上ETL项目: http://baike.
857 0
|
索引
[20150321]索引空块的问题.txt
[20150321]索引空块的问题.txt --晚上看了: 索引空块较多造成index range scan的IO成本较高 http://www.dbaxiaoyu.
751 0
|
SQL 关系型数据库 索引
[20150205]关于位图索引6.txt
[20150205]关于位图索引6.txt --许多人知道在oltp系统不适合使用位图索引.它的索引的记录结构如下是: 字段0:键值 字段1:开始rowid 字段2:结束rowid 字段3:位图信息,指示那行记录,位图1=>表示存在.
854 0