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

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

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

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

--昨天主要学习了解了字段3的相关信息,昨晚想起以前itpub的讨论,讲位图索引很容易出现阻塞,主要是如果事务发生在同一个行片,
--如果不在同一个行片,就不会出现阻塞,还是通过例子来说明:

1.建立测试环境:
SCOTT@test> @ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.3.0     Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

--drop table t purge;
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 ;

SCOTT@test> select * from t where status='Y' ;
        ID NAME                 S
---------- -------------------- -
         0 NC2C2RJYZJ           Y
         8 9A01DWFONE           Y
        16 KAGEJYP0P9           Y
        24 1625QJBKKM           Y
        32 M4YFHZNSYM           Y
        40 XGM1VKPXLY           Y
        48 U6UIUBLYZL           Y
        56 HH75RCZP2V           Y
        64 M2VZO0E3EJ           Y


update t set status='N' where id=0;
commit ;
create bitmap index ib_t_status on t(status);
alter system checkpoint ;
alter system dump datafile 4 block 531 ;

row#0[8003] flag: ------, lock: 0, len=29
col 0; len 1; (1):  4e
col 1; len 6; (6):  01 00 00 a7 00 00
col 2; len 6; (6):  01 00 00 a7 00 47
col 3; len 10; (10):  cf ff fe fe fe fe fe fe fe 01
row#1[7975] flag: ------, lock: 0, len=28
col 0; len 1; (1):  59
col 1; len 6; (6):  01 00 00 a7 00 08
col 2; len 6; (6):  01 00 00 a7 00 47
col 3; len 9; (9):  cf 01 01 01 01 01 01 01 01


update t set status='Y' where id=0;
commit ;
SCOTT@test> select rowid,t.* from t where status='Y';
ROWID                      ID NAME                 S
------------------ ---------- -------------------- -
AABJAiAAEAAAACnAAA          0 NC2C2RJYZJ           Y
AABJAiAAEAAAACnAAI          8 9A01DWFONE           Y
AABJAiAAEAAAACnAAQ         16 KAGEJYP0P9           Y
AABJAiAAEAAAACnAAY         24 1625QJBKKM           Y
AABJAiAAEAAAACnAAg         32 M4YFHZNSYM           Y
AABJAiAAEAAAACnAAo         40 XGM1VKPXLY           Y
AABJAiAAEAAAACnAAw         48 U6UIUBLYZL           Y
AABJAiAAEAAAACnAA4         56 HH75RCZP2V           Y
AABJAiAAEAAAACnABA         64 M2VZO0E3EJ           Y

9 rows selected.

SCOTT@test> @lookup_rowid AABJAiAAEAAAACnAAA
    OBJECT       FILE      BLOCK        ROW DBA                  TEXT
---------- ---------- ---------- ---------- -------------------- ----------------------------------------
    299042          4        167          0 4,167                alter system dump datafile 4 block 167 ;

alter system checkpoint ;
alter system dump datafile 4 block 531 ;

row#0[7946] flag: ------, lock: 2, len=29
col 0; len 1; (1):  4e
col 1; len 6; (6):  01 00 00 a7 00 00
col 2; len 6; (6):  01 00 00 a7 00 47
col 3; len 10; (10):  cf fe fe fe fe fe fe fe fe 01
row#1[7902] flag: ------, lock: 2, len=25
col 0; len 1; (1):  59
col 1; len 6; (6):  00 00 00 00 00 00
col 2; len 6; (6):  01 00 00 a7 00 07
col 3; len 6; (6):  c0 93 f9 80 e8 05
row#2[7975] flag: ------, lock: 0, len=28
col 0; len 1; (1):  59
col 1; len 6; (6):  01 00 00 a7 00 08
col 2; len 6; (6):  01 00 00 a7 00 47
col 3; len 9; (9):  cf 01 01 01 01 01 01 01 01
----- end of leaf block dump -----

--可以发现经过这样操作后,status='Y' ,被分成了两片,而且很奇怪的是开始rowid是00 00 00 00 00 00,结束01 00 00 a7 00 07.

2.先看看col 3; len 6; (6):  c0 93 f9 80 e8 05的情况:

-- c0 拆开
--11 000 000
-- 11 大于192.表示Multi-Byte Groups
-- 000 表示 ???????  
-- 000 表示1个字节长度.
--不懂先放一下.

-- f9 80 e8
-- 11 111 001
-- 11 大于192.表示Multi-Byte Groups
-- 111,必须考虑下面的扩展 0x80(128),注意这里高位是1.第3个字节是e8.
-- 001 表示2个字节长度. 不对,后面仅剩下1个字节.

--分析不出来,那位知道,先放一放. 开始rowid=00 00 00 00 00 00,如何确定范围呢?先存疑.

3.可以发现存在2个行片:(注意不要提交)
--会话1:
update t set status='N' where id=0;

--会话2:
update t set status='N' where id=64;

--挂起!
--这样一定会存在阻塞.虽然id=0,64的status='Y'不在同一个行片,但是这些记录在status='N'是在一个行片.

$ cat viewlock.sql
column sid format 99999
column username format a10
column osuser format a10
column machine format a10
column lock_type format a12
column mode_held format a10
column mode_requested format a10
column lock_id1 format a10
column lock_id2 format a10
column owner format a6
column object_type format a10
column object_name format a20
column block format a5
column lockwait format a20

SELECT lk.SID, se.username, se.osuser, se.machine,
       DECODE (lk.TYPE, 'TX', 'Transaction', 'TM', 'DML', 'UL', 'PL/SQL User Lock', lk.TYPE) lock_type,
       DECODE (lk.lmode,
               0, 'None',
               1, 'Null',
               2, 'Row-S (SS)',
               3, 'Row-X (SX)',
               4, 'Share',
               5, 'S/Row-X (SSX)',
               6, 'Exclusive',
               TO_CHAR (lk.lmode)
              ) mode_held,
       DECODE (lk.request,
               0, 'None',
               1, 'Null',
               2, 'Row-S (SS)',
               3, 'Row-X (SX)',
               4, 'Share',
               5, 'S/Row-X (SSX)',
               6, 'Exclusive',
               TO_CHAR (lk.request)
              ) mode_requested,
       TO_CHAR (lk.id1) lock_id1, TO_CHAR (lk.id2) lock_id2, ob.owner, ob.object_type, ob.object_name,
       DECODE (lk.BLOCK, 0, 'No', 1, 'Yes', 2, 'Global') BLOCK, se.lockwait
  FROM v$lock lk, dba_objects ob, v$session se
WHERE lk.TYPE IN ('TX','TM', 'UL') AND lk.SID = se.SID AND lk.id1 = ob.object_id(+);

SCOTT@test> @viewlock

   SID USERNAME   OSUSER     MACHINE    LOCK_TYPE    MODE_HELD  MODE_REQUE LOCK_ID1   LOCK_ID2   OWNER  OBJECT_TYP OBJECT_NAME          BLOCK LOCKWAIT
------ ---------- ---------- ---------- ------------ ---------- ---------- ---------- ---------- ------ ---------- -------------------- ----- --------------------
   396 SCOTT      oracle11g  hisdg      DML          Row-X (SX) None       299042     0          SCOTT  TABLE      T                    No
   595 SCOTT      oracle11g  hisdg      DML          Row-X (SX) None       299042     0          SCOTT  TABLE      T                    No    00000000BDC94740
   595 SCOTT      oracle11g  hisdg      Transaction  Exclusive  None       589825     30343                                             No    00000000BDC94740
   396 SCOTT      oracle11g  hisdg      Transaction  Exclusive  None       327711     46386                                             Yes
   595 SCOTT      oracle11g  hisdg      Transaction  None       Share      327711     46386                                             No    00000000BDC94740

4.如果两个修改成不同值,挂起就不会出现.
--会话1:
rollback;
update t set status='N' where id=0;

--会话2:
rollback;
update t set status='A' where id=64;
--没有阻塞.

--id=0 ,id=64,开始status='Y',分别属于不同的行片.但是修改为不同的值,一个修改为'N',另外一个修改为'A',这样可以分别操作不同
--的行片,就不会出现阻塞.

总结:
1.oltp系统使用位图索引要注意.
2.自己以为搞懂了col3的含义,还是有不懂的.
row#1[7902] flag: ------, lock: 2, len=25
col 0; len 1; (1):  59
col 1; len 6; (6):  00 00 00 00 00 00
col 2; len 6; (6):  01 00 00 a7 00 07
col 3; len 6; (6):  c0 93 f9 80 e8 05

--不知道那位知道.

目录
相关文章
|
SQL Oracle 关系型数据库
[20171206]位图区一定在数据文件开头吗.txt
[20171206]位图区一定在数据文件开头吗.txt --//如果问你oracle数据文件的位图区位于数据文件开头部分吗?我想大家的回答一定,实际上在10g下未必,因为10g建立的数据文件.
1081 0
|
SQL 索引 物联网
位图索引(Bitmap Index)——索引共用
  位图索引区别于传统B*树索引有两个结构特点:其一是叶子节点上是一个可能的索引列取值对应一个叶子节点。另一个就是叶子节点上通过一个位图向量表示对应行是否取定这个索引值。
2934 0
|
Oracle 关系型数据库
[20161107]关于数据文件位图区.txt
[20161107]关于数据文件位图区.txt --上个星期写一篇 [20161104]File Space Bitmap Block损坏能修复吗?.txt 链接:http://blog.itpub.net/267265/viewspace-2127826/       http://www.itpub.net/thread-2071023-1-1.html --里面提到 --正常数据文件第1块OS。
849 0
|
存储 索引
|
索引
数据结构实践——索引文件
本文是针对[数据结构基础系列(11):文件]中的实践项目。 【项目】索引文件 有若干学生的成绩数据如下,将这些数据保存到st数组中: 学号 姓名 年龄 性别 语文 数学 英语 1 陈华 20 男 78 90 84 5 张明 21 男 78 68 92 8
1165 0
|
测试技术 索引
[20150926]索引压缩问题.txt
[20150926]索引压缩问题.txt --以前如果索引前缀重复值很多,我会选择索引压缩,这样减少磁盘空间占用,索引范围扫描也可以减少磁盘IO,虽然这样可能消耗一些 --CUP资源,感觉影响不大。
905 0
|
SQL Oracle 关系型数据库
[20150803]使用函数索引注意的问题.txt
[20150803]使用函数索引注意的问题.txt --昨天在10g下优化时遇到一个奇怪的问题,做一个记录: --首先说明一下,最近一段时间在做一个项目的优化,这个项目实际上ETL项目: http://baike.
860 0
|
索引
[20150321]索引空块的问题.txt
[20150321]索引空块的问题.txt --晚上看了: 索引空块较多造成index range scan的IO成本较高 http://www.dbaxiaoyu.
754 0
|
数据库管理 索引
[20150204]关于位图索引5.txt
[20150204]关于位图索引5.txt --许多人知道在oltp系统不适合使用位图索引.它的索引的记录结构如下是: 字段0:键值 字段1:开始rowid 字段2:结束rowid 字段3:位图信息,指示那行记录,位图1=>表示存在.
909 0
|
测试技术 数据库管理 索引
[20150204]关于位图索引4.txt
[20150204]关于位图索引4.txt --许多人知道在oltp系统不适合使用位图索引.它的索引的记录结构如下是: 字段0:键值 字段1:开始rowid 字段2:结束rowid 字段3:位图信息,指示那行记录,位图1=>表示存在.
740 0