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

热门文章

最新文章

  • 1
    流量控制系统,用正则表达式提取汉字
    25
  • 2
    Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
    26
  • 3
    Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
    26
  • 4
    Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
    27
  • 5
    S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
    24
  • 6
    Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
    31
  • 7
    Redis05数据结构介绍,数据结构介绍,官方网站中看到
    22
  • 8
    JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
    20
  • 9
    JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
    20
  • 10
    定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
    19