自动段空间管理(ASSM),它首次出现在Oracle920里(在920以前,段空间的管理方式叫做MSSM,它是由连接列表freelist来完成的,因为freelist存在串行的问题,因此容易引起段头的争用与空间的浪费)。有了ASSM,连接列表freelist被位图所取代,它是一个二进制的数组,能够迅速有效地管理存储扩展和剩余区块(free block)。使用ASSM的一个巨大优势就是能够减轻缓冲区忙等待(buffer busy wait)。

我们来看看ASSM的管理结构是怎么样的:

--准备工作:

SQL));

Table created.

SQL,'dd');

 row created.

SQL> commit;

SQL> alter table test1 allocate extent(size 1M);

Table altered.

--获取这个segment是从哪一个extent开始的:

SQL> select EXTENT_ID , FILE_ID , BLOCK_ID , BLOCKS from dba_extents where segment_name='TEST1';

 EXTENT_ID    FILE_ID    BLOCK_ID     BLOCKS
---------- ---------- ---------- ----------

 rows selected.

--获取段头的位置

SQL> select header_block,header_file from dba_segments where segment_name='TEST1' and owner='SS';

HEADER_BLOCK HEADER_FILE
------------ -----------
                

我们发现第一extent的块号是128,而段头的块号是130,那么128和129这两个块到底做什么用的?

dump 块128的信息:
Start dump data blocks tsn: 6 file#:5 minblk 128 maxblk 128
Block dump from cache:
Dump of buffer cache at level 4 for tsn=6, rdba=20971648
BH (0x57bf7f2c) file#: 5 rdba: 0x01400080 (5/128) class: 8 ba: 0x57b52000
set: 3 pool 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,25
dbwrid: 0 obj: 77037 objn: 77037 tsn: 6 afn: 5 hint: f
hash: [0x5db05a2c,0x5db05a2c] lru: [0x533f76bc,0x57fea7b4]
lru-flags: on_auxiliary_list
ckptq: [NULL] fileq: [NULL] objq: [NULL]
st: FREE md: NULL tch: 0 lfb: 33
flags:
cr pin refcnt: 0 sh pin refcnt: 0
Block dump from disk:
buffer tsn: 6 rdba: 0x01400080 (5/128)
scn: 0x0000.00113bc5 seq: 0x02 flg: 0x04 tail: 0x3bc52002
frmt: 0x02 chkval: 0xd021 type: 0x20=FIRST LEVEL BITMAP BLOCK --在这儿发现原来是L1的bitmap块
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x009E9600 to 0x009EB600
9E9600 0000A220 01400080 00113BC5 04020000 [ .....@..;......]
9E9610 0000D021 00000000 00000000 00000000 [!...............]
9E9620 00000000 00000000 00000000 00000000 [................]
Repeat 1 times
9E9640 00000000 00000000 00000000 00000004 [................]
9E9650 FFFFFFFF 00000008 00000003 00000010 [................]
9E9660 00010002 00000000 00000000 00000000 [................]
9E9670 00000005 00000003 530045F5 530045F5 [.........E.S.E.S]
9E9680 00000000 0021000A 000002B7 00000003 [......!.........]
9E9690 01400081 00000000 00000000 00000008 [..@.............]
9E96A0 00000008 01400088 00000000 00000000 [......@.........]
9E96B0 00000000 00000005 00000000 00000001 [................]
9E96C0 00012CED 001139E1 00000000 01400080 [.,...9........@.]
9E96D0 00000008 00000000 01400088 00000008 [..........@.....]
9E96E0 00000008 00000000 00000000 00000000 [................]
9E96F0 00000000 00000000 00000000 00000000 [................]
Repeat 8 times
9E9780 00000000 00000000 00000000 55551511 [..............UU]
9E9790 00000000 00000000 00000000 00000000 [................]
Repeat 485 times
9EB5F0 00000000 00000000 00000000 3BC52002 [............. .;]
Dump of First Level Bitmap Block
--------------------------------
nbits : 4 nranges: 2 parent dba: 0x01400081 poffset: 0  --L1的块的父块地址是0x01400081,换算成10进制是129
unformatted: 8 total: 16 first useful block: 3
owning instance : 1
instance ownership changed at 02/16/2014 13:00:37
Last successful Search 02/16/2014 13:00:37
Freeness Status: nf1 0 nf2 0 nf3 0 nf4 5

Extent Map Block Offset: 4294967295
First free datablock : 3
Bitmap block lock opcode 3
Locker xid: : 0x000a.021.000002b7
Inc #: 0 Objd: 77037
HWM Flag: HWM Set
Highwater:: 0x01400088 ext#: 0 blk#: 8 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 5
mapblk 0x00000000 offset: 0
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x01400080 Length: 8 Offset: 0
0x01400088 Length: 8 Offset: 8
--当前L1管理的地址是2个区,16个块,有8个块还没被格式化
0:Metadata 1:Metadata 2:Metadata 3:75-100% free
4:75-100% free 5:75-100% free 6:75-100% free 7:75-100% free
8:unformatted 9:unformatted 10:unformatted 11:unformatted
12:unformatted 13:unformatted 14:unformatted 15:unformatted
--------------------------------------------------------

继续dump L1的父地址的块129信息:

Start dump data blocks tsn: 6 file#:5 minblk 129 maxblk 129
Block dump from cache:
Dump of buffer cache at level 4 for tsn=6, rdba=20971649
BH (0x57fea708) file#: 5 rdba: 0x01400081 (5/129) class: 9 ba: 0x57d48000
set: 3 pool 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,25
dbwrid: 0 obj: 77037 objn: 77037 tsn: 6 afn: 5 hint: f
hash: [0x5db40714,0x5db40714] lru: [0x57bf7fd8,0x56be25b0]
lru-flags: on_auxiliary_list
ckptq: [NULL] fileq: [NULL] objq: [NULL]
st: FREE md: NULL tch: 0 lfb: 33
flags:
cr pin refcnt: 0 sh pin refcnt: 0
Block dump from disk:
buffer tsn: 6 rdba: 0x01400081 (5/129)
scn: 0x0000.00113bc5 seq: 0x10 flg: 0x04 tail: 0x3bc52110
frmt: 0x02 chkval: 0xa942 type: 0x21=SECOND LEVEL BITMAP BLOCK --在这儿发现原来129号块是L2的块号
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00578600 to 0x0057A600
578600 0000A221 01400081 00113BC5 04100000 [!.....@..;......]
578610 0000A942 00000000 00000000 00000000 [B...............]
578620 00000000 00000000 00000000 00000000 [................]
Repeat 1 times
578640 00000000 00000000 00000000 01400082 [..............@.]
578650 0000000A 0000000A 00000000 00000001 [................]
578660 0021000A 000002B7 00012CED 00000001 [..!......,......]
578670 00000000 01400080 00010005 01400090 [......@.......@.]
578680 00010005 014000A0 00010005 014000B0 [......@.......@.]
578690 00010005 014000C0 00010005 014000D0 [......@.......@.]
5786A0 00010005 014000E0 00010005 014000F0 [......@.......@.]
5786B0 00010005 01400100 00010005 01400101 [......@.......@.]
5786C0 00010005 00000000 00000000 00000000 [................]
5786D0 00000000 00000000 00000000 00000000 [................]
Repeat 497 times
57A5F0 00000000 00000000 00000000 3BC52110 [.............!.;]
Dump of Second Level Bitmap Block
number: 10 nfree: 10 ffree: 0 pdba: 0x01400082 --它的父地址是82,换算成10进制是130,即使段头的地址
Inc #: 0 Objd: 77037
opcode:1
xid:
L1 Ranges : --当前L2块能管理的L1的范围。oracle的每一个进程在v$process中都有一个对应的pid,oracle通过pid来进行hash再来进行分配L1,从而达到大并发的效果
--------------------------------------------------------
0x01400080 Free: 5 Inst: 1
0x01400090 Free: 5 Inst: 1
0x014000a0 Free: 5 Inst: 1
0x014000b0 Free: 5 Inst: 1
0x014000c0 Free: 5 Inst: 1
0x014000d0 Free: 5 Inst: 1
0x014000e0 Free: 5 Inst: 1
0x014000f0 Free: 5 Inst: 1
0x01400100 Free: 5 Inst: 1
0x01400101 Free: 5 Inst: 1

--------------------------------------------------------

继续dump L2的父地址(即段头)的块130信息:

Start dump data blocks tsn: 6 file#:5 minblk 130 maxblk 130
Block dump from cache:
Dump of buffer cache at level 4 for tsn=6, rdba=20971650
BH (0x53bf290c) file#: 5 rdba: 0x01400082 (5/130) class: 4 ba: 0x53a82000
set: 3 pool 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,25
dbwrid: 0 obj: 77037 objn: -1 tsn: 6 afn: 5 hint: f
hash: [0x56be2580,0x5db1c214] lru: [0x53bead80,0x57ffb0b4]
ckptq: [NULL] fileq: [NULL] objq: [NULL]
st: CR md: NULL tch: 1
cr: [scn: 0x0.114112],[xid: 0x0.0.0],[uba: 0x0.0.0],[cls: 0x0.114112],[sfl: 0x0],[lc: 0x0.0]
flags:
cr pin refcnt: 0 sh pin refcnt: 0
BH (0x56be2504) file#: 5 rdba: 0x01400082 (5/130) class: 4 ba: 0x5680e000
set: 3 pool 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,25
dbwrid: 0 obj: 77037 objn: 77037 tsn: 6 afn: 5 hint: f
hash: [0x5db1c214,0x53bf2988] lru: [0x57fea7b4,0x583fabbc]
lru-flags: on_auxiliary_list
ckptq: [NULL] fileq: [NULL] objq: [NULL]
st: FREE md: NULL tch: 0 lfb: 33
flags:
cr pin refcnt: 0 sh pin refcnt: 0
Block dump from disk:
buffer tsn: 6 rdba: 0x01400082 (5/130)
scn: 0x0000.00113bcc seq: 0x01 flg: 0x04 tail: 0x3bcc2301
frmt: 0x02 chkval: 0x86f4 type: 0x23=PAGETABLE SEGMENT HEADER --发现类型是段头了
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00F07600 to 0x00F09600

....省略一些没有用的信息

Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 17 #blocks: 256 --一共有17个区,256个块,16个区有8个块,一个区有128个块,在下面的Extent Map也可以看到这个描述
last map 0x00000000 #maps: 0 offset: 2716
Highwater:: 0x01400088 ext#: 0 blk#: 8 ext size: 8 --高水位是第二个区的第一个块,插入只会插入高水位以下的块。并发插入时,高水位的位置会影响限制并发插入,因为只能插入高水位以下的块,对于8K的BLOCK大小:1M的区=128个块,那么超过128个并发会有热块,从而产生buffer busy waits; 如果是8M的区=1024个块,超过1024并发同样也会产生热块

#blocks in seg. hdr's freelists: 0
#blocks below: 5
mapblk 0x00000000 offset: 0
Unlocked
--------------------------------------------------------
Low HighWater Mark :  --低高水位,低高水位之下的数据都已经使用了
Highwater:: 0x01400088 ext#: 0 blk#: 8 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 5
mapblk 0x00000000 offset: 0
Level 1 BMB for High HWM block: 0x01400080
Level 1 BMB for Low HWM block: 0x01400080
--------------------------------------------------------
Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0
L2 Array start offset: 0x00001434
First Level 3 BMB: 0x00000000
L2 Hint for inserts: 0x01400081 --二级位图块的DBA
Last Level 1 BMB: 0x01400101
Last Level II BMB: 0x01400081
Last Level III BMB: 0x00000000
Map Header:: next 0x00000000 #extents: 17 obj#: 77037 flag: 0x10000000
Inc # 0
Extent Map --segment有几个extent,extent的起始地址以及包含的块数
-----------------------------------------------------------------
0x01400080 length: 8
0x01400088 length: 8
0x01400090 length: 8
0x01400098 length: 8
0x014000a0 length: 8
0x014000a8 length: 8
0x014000b0 length: 8
0x014000b8 length: 8
0x014000c0 length: 8
0x014000c8 length: 8
0x014000d0 length: 8
0x014000d8 length: 8
0x014000e0 length: 8
0x014000e8 length: 8
0x014000f0 length: 8
0x014000f8 length: 8
0x01400100 length: 128

Auxillary Map --辅助map,extent由哪个L1管理及所管理的区,   和之前L1看到的信息对应

--------------------------------------------------------
Extent 0 : L1 dba: 0x01400080 Data dba: 0x01400083
Extent 1 : L1 dba: 0x01400080 Data dba: 0x01400088
Extent 2 : L1 dba: 0x01400090 Data dba: 0x01400091
Extent 3 : L1 dba: 0x01400090 Data dba: 0x01400098
Extent 4 : L1 dba: 0x014000a0 Data dba: 0x014000a1
Extent 5 : L1 dba: 0x014000a0 Data dba: 0x014000a8
Extent 6 : L1 dba: 0x014000b0 Data dba: 0x014000b1
Extent 7 : L1 dba: 0x014000b0 Data dba: 0x014000b8
Extent 8 : L1 dba: 0x014000c0 Data dba: 0x014000c1
Extent 9 : L1 dba: 0x014000c0 Data dba: 0x014000c8
Extent 10 : L1 dba: 0x014000d0 Data dba: 0x014000d1
Extent 11 : L1 dba: 0x014000d0 Data dba: 0x014000d8
Extent 12 : L1 dba: 0x014000e0 Data dba: 0x014000e1
Extent 13 : L1 dba: 0x014000e0 Data dba: 0x014000e8
Extent 14 : L1 dba: 0x014000f0 Data dba: 0x014000f1
Extent 15 : L1 dba: 0x014000f0 Data dba: 0x014000f8
Extent 16 : L1 dba: 0x01400100 Data dba: 0x01400102
--------------------------------------------------------

Second Level Bitmap block DBAs
--------------------------------------------------------
DBA 1: 0x01400081

End dump data blocks tsn: 6 file#: 5 minblk 130 maxblk 130

ASSM三级位图块的结构可以用下图表示:

L1中有指向L3的指针,L2有指向L3的指针,L3中有多个数据块的指针和状态。
(1)每个L3中,有多个L2的地址(第一个L3是段头)。
(2)每个L2中,有多个L1的地址。
(3)每个L1中,有多个数据块地址。
ORACLE最多支持三级位图,Segment Heade可以管理极大数据量的对象的空间,很难出现另一个三级位图块。
一级位图用于管理具体数据块的使用,包括头部三个块,不仅仅指数据块的状态,标识的状态有Metadata、75-100% free、50-75% free、25-50% free、0-25% free、full、unformatted。
二级位图块记录了它管理的一级位图块(FIRST LEVEL BITMAP BLOCK)的地址。
三级位图块记录的内容比较多,除了记录了二级位图块(SECOND LEVEL BITMAP BLOCK)的地址。还记录了各个区的首块地址以及各个区的DB BLOCK的个数,段的各个区所对应的FIRST LEVEL BITMAP BLOCK的块地址以及区里面记录数据的数据块的起始地址。

如果一个区拥有很多块,这时会在一个区里出现两个或多个FIRST LEVEL BITMAP BLOCK,这些FIRST LEVEL BITMAP BLOCK分别管理一个区中的一些块,当区的数据块比较少时,一个区的FIRST LEVEL BITMAP BLOCK可以跨区管理多个区的数据块,BITMAP BOLCK最多为三级。

ASSM 的三级位图结构的更多相关文章

  1. oracle 表空管理方式(LMT)、ASSM段管理方式、一级位图块、二级位图块、三级位图块。

    今天是2013-12-16,今天和明天是我学习oracle生涯中一个特殊的日子.今天晚上进行了一下表空间管理方式的学习,在此记录一下笔记. 对于oracle数据库最小i/0单位是数据块,最想分配空间单 ...

  2. CreateDIBSection和位图结构

    2019独角兽企业重金招聘Python工程师标准>>> 理解分辨率 我们常说的屏幕分辨率为640×480,刷新频率为70Hz,意思是说每行要扫描640个象素,一共有480行,每秒重复 ...

  3. SQL省市区三级表结构

    -- 表的结构 areaDROP TABLE  area;CREATE TABLE  area (   id int NOT NULL ,  areaID int NOT NULL,  area va ...

  4. ARM的三级流水线结构

    看到汇编中很多关于程序返回与中断返回时处理地址都很特别,仔细想想原来是流水线作用的效果.所以,决定总结学习下ARM流水线. ARM7处理器采用3级流水线来增加处理器指令流的速度,能提供0.9MIPS/ ...

  5. 本地管理表空间(LMT)与自动段空间管理(ASSM)概念

    创建表空间时,extent management local 定义本地管理表空间(LMT),segment space management auto 定义自动段空间管理(ASSM). extent ...

  6. (转)Linux中的位图

    原文:https://www.jianshu.com/p/74626c2d2916 什么是位图 位图(bitmap)的定义 维基百科中关于位图的介绍: 一种数据结构,代表了有限域中的稠集(dense ...

  7. DIB位图(Bitmap)的读取和保存

    设备无关位图(Device Independent Bitmap)是可以保存在磁盘的位图文件,可以从磁盘读取到内存或者从内存保存到磁盘上.它的文件结构是标准化的,可以在Windows/Linux/Un ...

  8. CDC的StretchBlt函数载入位图时图片失真问题

    最近遇到加载的bmp图片出现失真问题,查找得知需要用SetStretchBltMode函数设置拉伸模式. 函数原型:int SetSTretchBltMode(HDC hdc, int iStretc ...

  9. 位图文件格式及linux下C语言来操作位图文件

    说到图片,位图(Bitmap)当然是最简单的,它是Windows显示图片的基本格式,其文件扩展名为*.BMP.由于没有经过任何的压缩,故BMP图片往往很大.在Windows下,任何格式的图片文件都要转 ...

随机推荐

  1. Docker与LXC的区别

    转自: http://blog.csdn.net/wangtaoking1/article/details/45043523 Docker并不是LXC的替代品,Docker的底层就是使用了LXC来实现 ...

  2. zaqar项目介绍

    Zaqar is a multi-tenant cloud messaging and notification service for web and mobile developers. It c ...

  3. poll函数

    poll函数与select函数的功能基本一样,其定义如下: #include <poll.h> int poll(struct pollfd fds[], nfds_t nfds, int ...

  4. Unity3d《Shader篇》Logo闪光特效

    Shader "Custom/Flash" { Properties { _MainTex ("Base (RGB)", 2D) = "white&q ...

  5. iOS 关于AFNetworking ssl 待完成

    先普及下基本知识,都是从网上搜到的,感谢原作者的辛勤付出! 原文链接 http://m.blog.csdn.net/blog/bytxl/8586830 x509是数字证书的规范,P7和P12是两种封 ...

  6. Qt不同类之间信号槽连接

    1.类必须继承QObject. #ifndef TESTA_H #define TESTA_H #include <QObject> class TestA : public QObjec ...

  7. ACM/ICPC 之 数据结构-邻接表+DP+队列+拓扑排序(TSH OJ-旅行商TSP)

    做这道题感觉异常激动,因为在下第一次接触拓扑排序啊= =,而且看了看解释,猛然发现此题可以用DP优化,然后一次A掉所有样例,整个人激动坏了,哇咔咔咔咔咔咔咔~ 咔咔~哎呀,笑岔了- -|| 旅行商(T ...

  8. 22. javacript高级程序设计-高级技巧

    1. 高级技巧 1.1 函数 l 可以使用惰性载入函数,将任何分支推迟到第一个调用函数的时候 l 函数绑定可以让你创建始终在指定环境中运行的函数,同时函数柯里化可以让你创建已经填写了某些参数的函数 l ...

  9. 监控Tomcat解决方案(监控应用服务器系列文章分享)

    使用JMX接口开发监控程序  ◆ 全部代码需要从零开始,代码量较大  ◆ 支持各不同版本比较麻烦,每个版本可能有差异  ◆ 可支配性强  ◆ 最重要的一个缺点是,配置比较麻烦 Tomcat激活JMX远 ...

  10. 【C语言】pragma

    ① #pragma comment (lib, "libgsl.a") 这是告诉编译器在编译形成的.obj文件和.exe文件中加一条信息,使得 链接器在链接库的时候要去找libgs ...