首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Oracle频道
中国IT教育
Google
首页 入门基础 安装配置 体系架构 PLSQL 备份恢复 性能调优 开发技术 资讯动态 考试认证 下载 专题 讨论
您现在的位置: 中国IT实验室 >> Oracle >> 体系架构 >> 正文

Oracle ASSM三级位图块结构

  前几天Piner发布了一个悬赏:寻找ASSM三级位图块的文章,同时给出了对于ASSM结构的猜想。

  Piner猜想的结构和我想像的不同,我认为ASSM的结构应该如下图所示:

  

  也就是说我认为BMB的结构应该是均衡的,同时段头的PAGETABLE SEGMENT HEADER同时充当了第0个3级位图块的角色。

  在PAGETABLE SEGMENT HEADER中实际上我们可以很容易的看到这样的输出:

--------------------------------------------------------
Segment Type: 1 nl2: 103 blksz: 2048 fbsz: 0 
L2 Array start offset: 0x00000434
First Level 3 BMB: 0x00000000
L2 Hint for inserts: 0x0355cfad
Last Level 1 BMB: 0x03560c9c
Last Level II BMB: 0x0355cfad
Last Level III BMB: 0x00000000
Map Header:: next 0x034000bf #extents: 51 obj#: 33141 flag: 0x20000000
Extent Map
-----------------------------------------------------------------

  也就是说,这里记录了First Level 3 BMB和Last Level III BMB的地址,那么这就足够了,这里的双向指针完全可以进行Level 3级位图块的导航,而这第0个三级位图块也即段头,并无需记录所有3级位图块的地址。

  由于产生另外一个3级位图块并不容易,所以Piner才提出悬赏,他构造了一个873G的大表,仍然没有产生另外的3级位图块:

SQL> select bytes/1024/1024/1024 "SIZE(G)" from user_segments where 
segment_name='TEST'; SIZE(G) ---------- 873.25

  为了寻找3级位图块,我着手做了以下实验,实验要能够:

  1.实现更快快速的区间分配与扩展

  2.使第0个3级位图块也即segment header尽量小,以便进一步扩展

  为此我创建了一个2k block_size的表空间,设置uniform size区间大小为10K,这样可以尽量所见空间耗用:

SQL> create tablespace eygle
2 datafile 'd:\EYGLE01.DBF' size 1024M reuse blocksize 2048
3 extent management local uniform size 10k
4 segment space management auto; 
表空间已创建。
SQL> set timing on
SQL> alter tablespace eygle add datafile 'f:\eygle02.dbf' size 8191M reuse;
表空间已更改。
已用时间: 00: 44: 42.08

  注意,增加了一个8G的数据文件,足足用了我44分钟,这是一个Windows平台,异常缓慢。

  然后创建一个数据表,设置高pctfree值,使得每个Block只存储一行数据,然后插入1千万记录:

SQL> create table EYGLE
2 (
3 ID NUMBER(8),
4 UNAME CHAR(1000)
5 )
6 tablespace eygle
7 pctfree 50
8 initrans 1
9 maxtrans 255
10 ; 
表已创建。
已用时间: 00: 00: 00.00
SQL> begin
2 for i in 1 .. 100 loop
3 for i in 1 .. 100000 loop
4 insert into eygle values(i,'eygle');
5 end loop;
6 commit;
7 end loop;
8 end;
9 /

  完成这些操作之后,这个表用了大约9G空间:

SQL> select bytes/1024/1024/1024 sizegb from dba_segments
2 where segment_name='EYGLE'; 
SIZEGB
----------
8.9988327

  此时第一个3级位图块出现了,这是多么珍贵的一个3级位图块啊:

Start dump data blocks tsn: 12 file#: 13 minblk 4032222 maxblk 4032222
buffer tsn: 12 rdba: 0x037d86de (13/4032222)
scn: 0x0000.00bdc864 seq: 0x01 flg: 0x04 tail: 0xc8642201
frmt: 0x02 chkval: 0xf597 type: 0x22=THIRD LEVEL BITMAP BLOCK
Dump of Third Level Bitmap Block
number: 9 , next : 0x00000000 
L2 Ranges :
--------------------------------------------------------
0x037d86dd
0x037dd22d 0x037e1d7d 0x037e68cd 0x037eb41d
0x037eff6d 0x037f4abd 0x037f960d 0x037fe15d

--------------------------------------------------------
End dump data blocks tsn: 12 file#: 13 minblk 4032222 maxblk 4032222

  这个位图上上存在一个向下的指针:next : 0x00000000 ,当然现在还没有数值,我们可以再产生下一个3级位图块来观察。

  那么实际上到这里已经足够了,我的图示已经得到了足够的说明。

【责编:John】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 ·Java入门 Tomcat的配置技巧精华专题…
 ·Oracle RMAN物理备份技术详解…
 今日更新
 社区讨论
 博客论点
 频道精选
 Oracle频道相关导航