天天看点

Oracle ASSM三级位图块结构(未看)

Oracle ASSM三级位图块结构 0

作者: eygle | English 【转载时请标明 出处和作者信息】|【 恩墨学院 OCM培训传DBA成功之道】

链接: http://www.eygle.com/archives/2007/07/oracle_assm_level3_bmb.html 站内相关文章|Related Articles Oracle KKS 层-Kernel Kompile Shared (cursors)

DBA手记:共享池的改进与ORA-04031的变化

数据字典视图之:V$TYPE_SIZE 结构

Oracle KSL Latch 管理层 与 Latch管理

Oracle10gR2中的Mutex竞争的案例

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

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

Oracle 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级位图块来观察。

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

-The End-

历史上的今天...

      >> 2006-07-04文章:

              首届杰出数据库工程师复选名单公布

              在北京 感觉地震

      >> 2005-07-04文章:

              徐克的新作《七剑》

相关文章:

  • 2013数据库大会:崔华-基于Oracle的SQL优化案例分析
  • Oracle11g数据库的认证体系结构
  • Oracle数据库恢复:数据库黑客攻击案例一则
  • Oracle Database 12c 新特性 - Pluggable Database
  • Oracle数据库恢复:风险意识缺乏导致的数据风险
  • Oracle中模拟及修复数据块损坏
  • Oracle数据库以44.4%再占市场首位

继续阅读