楼主: biti_rainy

[精华] bitmap 的一点探究

[复制链接]
论坛徽章:
24
生肖徽章:狗
日期:2006-09-07 10:14:43数据库板块每日发贴之星
日期:2008-07-26 01:02:20生肖徽章2007版:兔
日期:2008-10-13 11:10:11奥运会纪念徽章:铁人三项
日期:2008-10-24 13:27:21开发板块每日发贴之星
日期:2008-12-27 01:01:09生肖徽章2007版:马
日期:2009-11-18 10:45:032010新春纪念徽章
日期:2010-03-01 11:21:02ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51ERP板块每日发贴之星
日期:2011-05-18 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
31#
发表于 2007-11-9 20:37 | 只看该作者
根据10楼的例子,索引存放的是 F 或 M

这样对于得col0 是 F 或 M所对应的ascii

为何0 - 5 没有按ascii存放呢?

使用道具 举报

回复
论坛徽章:
24
生肖徽章:狗
日期:2006-09-07 10:14:43数据库板块每日发贴之星
日期:2008-07-26 01:02:20生肖徽章2007版:兔
日期:2008-10-13 11:10:11奥运会纪念徽章:铁人三项
日期:2008-10-24 13:27:21开发板块每日发贴之星
日期:2008-12-27 01:01:09生肖徽章2007版:马
日期:2009-11-18 10:45:032010新春纪念徽章
日期:2010-03-01 11:21:02ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51ERP板块每日发贴之星
日期:2011-05-18 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
32#
发表于 2007-11-9 21:14 | 只看该作者
一条一条处理,有点明白了,但是对于第一个批量插入20条的例子,对于1的处理

rowid的范围为何和其他的不一样呢?

使用道具 举报

回复
论坛徽章:
24
生肖徽章:狗
日期:2006-09-07 10:14:43数据库板块每日发贴之星
日期:2008-07-26 01:02:20生肖徽章2007版:兔
日期:2008-10-13 11:10:11奥运会纪念徽章:铁人三项
日期:2008-10-24 13:27:21开发板块每日发贴之星
日期:2008-12-27 01:01:09生肖徽章2007版:马
日期:2009-11-18 10:45:032010新春纪念徽章
日期:2010-03-01 11:21:02ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51ERP板块每日发贴之星
日期:2011-05-18 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
33#
发表于 2007-11-10 09:34 | 只看该作者
终于弄清楚每个索引是怎么存的了。



'M': 11100110001010
'F': 00011001110101

<< lines cut here >>
row#0[1866] flag: ----, lock: 0
col 0; len 1; (1): 46
col 1; len 6; (6): 01 00 00 0d 00 00
col 2; len 6; (6): 01 00 00 0d 00 0f
col 3; len 3; (3): c9 98 2b
row#1[1844] flag: ----, lock: 0
col 0; len 1; (1): 4d
col 1; len 6; (6): 01 00 00 0d 00 00
col 2; len 6; (6): 01 00 00 0d 00 0f
col 3; len 3; (3): c9 67 14
----- end of leaf block dump -----


对于M
11100110 001010
前八位反过来取,因为后插入的位要高,所以就有 67
同理,后六位为 14

这样对于F
00011001 110101 => 98 2b

使用道具 举报

回复
论坛徽章:
24
生肖徽章:狗
日期:2006-09-07 10:14:43数据库板块每日发贴之星
日期:2008-07-26 01:02:20生肖徽章2007版:兔
日期:2008-10-13 11:10:11奥运会纪念徽章:铁人三项
日期:2008-10-24 13:27:21开发板块每日发贴之星
日期:2008-12-27 01:01:09生肖徽章2007版:马
日期:2009-11-18 10:45:032010新春纪念徽章
日期:2010-03-01 11:21:02ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51ERP板块每日发贴之星
日期:2011-05-18 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
34#
发表于 2007-11-10 10:00 | 只看该作者
最初由 hanjs 发布
[B]一条一条处理,有点明白了,但是对于第一个批量插入20条的例子,对于1的处理

rowid的范围为何和其他的不一样呢? [/B]


下面是我按biti的例子作的,下面的文件是先truncate table tn后dump的信息

*** 2007-11-10 09:19:12.000
Start dump data blocks tsn: 0 file#: 1 minblk 50762 maxblk 50762
buffer tsn: 0 rdba: 0x0040c64a (1/50762)
scn: 0x0000.000ce4a3 seq: 0x01 flg: 0x04 tail: 0xe4a30601
frmt: 0x02 chkval: 0x5018 type: 0x06=trans data
Block header dump:  0x0040c64a
Object id on Block? Y
seg/obj: 0x766b  csc: 0x00.ce4a3  itc: 2  flg: -  typ: 2 - INDEX
     fsl: 0  fnx: 0x0 ver: 0x01

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000

Leaf block dump
===============
header address 87691356=0x53a105c
kdxcolev 0
KDXCOLEV Flags = - - -
kdxcolok 0
kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y
kdxconco 4
kdxcosdc 0
kdxconro 0
kdxcofbo 36=0x24
kdxcofeo 8036=0x1f64
kdxcoavs 8000
kdxlespl 0
kdxlende 0
kdxlenxt 0=0x0
kdxleprv 0=0x0
kdxledsz 0
kdxlebksz 8036
----- end of leaf block dump -----
End dump data blocks tsn: 0 file#: 1 minblk 50762 maxblk 50762

在执行
insert into tn select rownum,mod(rownum,5) from all_objects where rownum < 21;
commit;
后dump的情况,有一点费解的地方,就是出现了row#5
[/COLOR]
*** 2007-11-10 09:19:58.000
Start dump data blocks tsn: 0 file#: 1 minblk 50762 maxblk 50762
buffer tsn: 0 rdba: 0x0040c64a (1/50762)
scn: 0x0000.000ce60c seq: 0x01 flg: 0x02 tail: 0xe60c0601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump:  0x0040c64a
Object id on Block? Y
seg/obj: 0x766b  csc: 0x00.ce4a3  itc: 2  flg: -  typ: 2 - INDEX
     fsl: 0  fnx: 0x0 ver: 0x01

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
0x02   0x0004.002.00000380  0x0080003d.005e.10  --U-    6  fsc 0x0008.000ce60c

Leaf block dump
===============
header address 88089180=0x540225c
kdxcolev 0
KDXCOLEV Flags = - - -
kdxcolok 0
kdxcoopc 0x80: opcode=0: iot flags=--- is converted=Y
kdxconco 4
kdxcosdc 0
kdxconro 6
kdxcofbo 48=0x30
kdxcofeo 7912=0x1ee8
kdxcoavs 7864
kdxlespl 0
kdxlende 1
kdxlenxt 0=0x0
kdxleprv 0=0x0
kdxledsz 0
kdxlebksz 8036
row#0[8007] flag: -----, lock: 2
col 0; len 1; (1):  80
col 1; len 6; (6):  00 40 c6 42 00 00
col 2; len 6; (6):  00 40 c6 42 00 17
col 3; len 4; (4):  ca 10 42 08
row#1[7984] flag: -----, lock: 2
col 0; len 2; (2):  c1 02
col 1; len 6; (6):  00 40 c6 42 00 00
col 2; len 6; (6):  00 40 c6 42 00 0f
col 3; len 3; (3):  c9 21 84
row#2[7960] flag: -----, lock: 2
col 0; len 2; (2):  c1 03
col 1; len 6; (6):  00 40 c6 42 00 00
col 2; len 6; (6):  00 40 c6 42 00 17
col 3; len 4; (4):  ca 42 08 01
row#3[7936] flag: -----, lock: 2
col 0; len 2; (2):  c1 04
col 1; len 6; (6):  00 40 c6 42 00 00
col 2; len 6; (6):  00 40 c6 42 00 17
col 3; len 4; (4):  ca 84 10 02
row#4[7912] flag: -----, lock: 2
col 0; len 2; (2):  c1 05
col 1; len 6; (6):  00 40 c6 42 00 00
col 2; len 6; (6):  00 40 c6 42 00 17
col 3; len 4; (4):  ca 08 21 04
row#5[8030] flag: ---D-, lock: 2
col 0; NULL
col 1; NULL
col 2; NULL
col 3; NULL
----- end of leaf block dump -----
End dump data blocks tsn: 0 file#: 1 minblk 50762 maxblk 50762
[/COLOR]

再插入 insert into tn values (21,1); commit; dump后

row#0[8007] flag: -----, lock: 0
col 0; len 1; (1):  80
col 1; len 6; (6):  00 40 c6 42 00 00
col 2; len 6; (6):  00 40 c6 42 00 17
col 3; len 4; (4):  ca 10 42 08
row#1[7984] flag: -----, lock: 2
col 0; len 2; (2):  c1 02
col 1; len 6; (6):  00 40 c6 42 00 00
col 2; len 6; (6):  00 40 c6 42 00 0f
col 3; len 3; (3):  c9 21 84
看到第一个存放1的bitmap认为已经满了,我是这样猜想的
在一次插入20条时,1对应的key
10000 10000 10000 10000
上LS的解释,插入的位越来越高,这样反转下
10000100 00100001 0000 => 21 84注意,后面的4位0,oracle认为没有必要存储了,因为一次commit的记录就这么多,所以认为这个已经满了,不知道大家是否认同这个说法?[/COLOR]
row#2[7891] flag: -----, lock: 2
col 0; len 2; (2):  c1 02
col 1; len 6; (6):  00 40 c6 42 00 10
col 2; len 6; (6):  00 40 c6 42 00 17
col 3; len 1; (1):  04
当在插入一条1时,oracle又新分配了一个entry,从col3可以看出,按前面yang版主的存放的是相对于00 40 c6 42 00 10
的rowid,第17行,也就是第一个entry满的rowid+1,我们可以看到
SQL> select dump(rowid,16) from tn where a=17;

DUMP(ROWID,16)
--------------------------------------------------------------------------------
Typ=69 Len=10: 0,0,76,6c,0,40,c6,42,0,10

就是00 40 c6 42 00 10

而新插入的rowid
SQL> select dump(rowid,16) from tn where a=21;

DUMP(ROWID,16)
--------------------------------------------------------------------------------
Typ=69 Len=10: 0,0,76,6c,0,40,c6,42,0,14

可以看出,后面14-10 = 04
[/COLOR]

row#3[7960] flag: -----, lock: 0
col 0; len 2; (2):  c1 03
col 1; len 6; (6):  00 40 c6 42 00 00
col 2; len 6; (6):  00 40 c6 42 00 17
col 3; len 4; (4):  ca 42 08 01
row#4[7936] flag: -----, lock: 0
col 0; len 2; (2):  c1 04
col 1; len 6; (6):  00 40 c6 42 00 00
col 2; len 6; (6):  00 40 c6 42 00 17
col 3; len 4; (4):  ca 84 10 02
row#5[7912] flag: -----, lock: 0
col 0; len 2; (2):  c1 05
col 1; len 6; (6):  00 40 c6 42 00 00
col 2; len 6; (6):  00 40 c6 42 00 17
col 3; len 4; (4):  ca 08 21 04
----- end of leaf block dump -----
End dump data blocks tsn: 0 file#: 1 minblk 50762 maxblk 50762




目前唯一的疑惑是,怎么看出entry存放的是 0,1,2,3,4,5的??

使用道具 举报

回复
论坛徽章:
24
生肖徽章:狗
日期:2006-09-07 10:14:43数据库板块每日发贴之星
日期:2008-07-26 01:02:20生肖徽章2007版:兔
日期:2008-10-13 11:10:11奥运会纪念徽章:铁人三项
日期:2008-10-24 13:27:21开发板块每日发贴之星
日期:2008-12-27 01:01:09生肖徽章2007版:马
日期:2009-11-18 10:45:032010新春纪念徽章
日期:2010-03-01 11:21:02ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51ERP板块每日发贴之星
日期:2011-05-18 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
35#
发表于 2007-11-10 10:43 | 只看该作者
最初由 hanjs 发布
[B]根据10楼的例子,索引存放的是 F 或 M

这样对于得col0 是 F 或 M所对应的ascii

为何0 - 5 没有按ascii存放呢? [/B]


唉,弄明白了,存放得是16进制的,dump了一下

SQL> select dump(1,16) from tb where a=1;

DUMP(1,16)
-----------------
Typ=2 Len=2: c1,2

SQL> select dump(0,16) from tb where a=1;

DUMP(0,16)
---------------
Typ=2 Len=1: 80

SQL> select dump('F',16) from dual;

DUMP('F',16)
----------------
Typ=96 Len=1: 46

SQL>

这回懂了,晕死!

使用道具 举报

回复
论坛徽章:
0
36#
发表于 2007-11-12 00:15 | 只看该作者
看得眼花缭乱

使用道具 举报

回复
论坛徽章:
0
37#
发表于 2008-3-17 15:50 | 只看该作者

回复 #36 romanyu 的帖子

很好的贴子,有利于理解bitmap概念。

使用道具 举报

回复
论坛徽章:
15
奥运会纪念徽章:击剑
日期:2008-07-17 14:58:53懒羊羊
日期:2015-03-04 14:52:11马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:02ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:152012新春纪念徽章
日期:2012-01-04 11:53:54ITPUB十周年纪念徽章
日期:2011-11-01 16:23:262011新春纪念徽章
日期:2011-02-18 11:42:472011新春纪念徽章
日期:2011-01-04 10:35:17ITPUB9周年纪念徽章
日期:2010-10-08 09:34:01
38#
发表于 2009-6-18 16:24 | 只看该作者
还是以前的帖子有技术含量啊,现在大师们都不怎么写了

使用道具 举报

回复
论坛徽章:
47
蒙奇·D·路飞
日期:2017-03-27 08:04:23马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11一汽
日期:2013-09-01 20:46:27复活蛋
日期:2013-03-13 07:55:232013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20
39#
发表于 2009-6-21 02:25 | 只看该作者
原帖由 lsq_008 于 2009-6-18 02:24 发表
还是以前的帖子有技术含量啊,现在大师们都不怎么写了


Nowadays people write their own notes in personal blog. (I don't have one, but I put them in static text or html files on my web site.)

By the way, overall Oracle skills in China have improved a lot in recent years. Don't you think?

Yong Huang

使用道具 举报

回复
论坛徽章:
176
现任管理团队成员
日期:2011-05-07 01:45:08版主7段
日期:2012-07-05 02:21:03ITPUB长老会成员
日期:2015-05-07 15:11:10ITPUB年度最佳版主
日期:2011-04-08 18:37:09ITPUB年度最佳版主
日期:2011-12-28 15:24:18ITPUB牛人
日期:2010-10-25 12:41:322010数据库技术大会纪念徽章
日期:2015-04-23 10:33:192011数据库大会纪念章
日期:2015-04-23 10:33:192012数据库大会纪念章
日期:2015-04-23 10:33:192013数据库大会纪念章
日期:2015-04-23 10:33:19
40#
发表于 2009-6-26 14:33 | 只看该作者
打包,收藏!!!!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表