ASSM 的三级位图结构
自动段空间管理(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 的三级位图结构的更多相关文章
- oracle 表空管理方式(LMT)、ASSM段管理方式、一级位图块、二级位图块、三级位图块。
今天是2013-12-16,今天和明天是我学习oracle生涯中一个特殊的日子.今天晚上进行了一下表空间管理方式的学习,在此记录一下笔记. 对于oracle数据库最小i/0单位是数据块,最想分配空间单 ...
- CreateDIBSection和位图结构
2019独角兽企业重金招聘Python工程师标准>>> 理解分辨率 我们常说的屏幕分辨率为640×480,刷新频率为70Hz,意思是说每行要扫描640个象素,一共有480行,每秒重复 ...
- SQL省市区三级表结构
-- 表的结构 areaDROP TABLE area;CREATE TABLE area ( id int NOT NULL , areaID int NOT NULL, area va ...
- ARM的三级流水线结构
看到汇编中很多关于程序返回与中断返回时处理地址都很特别,仔细想想原来是流水线作用的效果.所以,决定总结学习下ARM流水线. ARM7处理器采用3级流水线来增加处理器指令流的速度,能提供0.9MIPS/ ...
- 本地管理表空间(LMT)与自动段空间管理(ASSM)概念
创建表空间时,extent management local 定义本地管理表空间(LMT),segment space management auto 定义自动段空间管理(ASSM). extent ...
- (转)Linux中的位图
原文:https://www.jianshu.com/p/74626c2d2916 什么是位图 位图(bitmap)的定义 维基百科中关于位图的介绍: 一种数据结构,代表了有限域中的稠集(dense ...
- DIB位图(Bitmap)的读取和保存
设备无关位图(Device Independent Bitmap)是可以保存在磁盘的位图文件,可以从磁盘读取到内存或者从内存保存到磁盘上.它的文件结构是标准化的,可以在Windows/Linux/Un ...
- CDC的StretchBlt函数载入位图时图片失真问题
最近遇到加载的bmp图片出现失真问题,查找得知需要用SetStretchBltMode函数设置拉伸模式. 函数原型:int SetSTretchBltMode(HDC hdc, int iStretc ...
- 位图文件格式及linux下C语言来操作位图文件
说到图片,位图(Bitmap)当然是最简单的,它是Windows显示图片的基本格式,其文件扩展名为*.BMP.由于没有经过任何的压缩,故BMP图片往往很大.在Windows下,任何格式的图片文件都要转 ...
随机推荐
- lol 正在刷leetcode
letcode easy 刷了90%了 我要写个随笔庆祝下 挑着做的太不要脸了,接下来要做剩下的了 :) 剩下的决定直接参考答案了 :) 有些答案看着也好迷糊.水平太差了.(英文水平差,看不懂题目.. ...
- poj 1011
http://poj.org/problem?id=1011 这是一道POJ的搜索的题目,最开始确实难以理解,但做过一些搜索的题目后,也没那么难了. 大概题意就是,现在有N根木头,要拼成若干根木头,并 ...
- logging模块使用示例
日志等级说明: UNSET < DEBUG < INFO < WARNNING < ERROR < CRITICAL import logging logger = l ...
- svn上传报Authorization failed错误解决办法
svn上传文件时没有弹出用户登录界面,而是直接报Authorization failed错误.出现该问题基本都是三个配置文件的问题,下面把这个文件列出来 svnserve.conf配置文件中的 [ge ...
- 在本地计算机无法启动MYSQL服务错误1067进程意外终止
在本地计算机无法启动MYSQL服务错误1067进程意外终止 这种情况一般是my.ini文件配置出错了, 你可以删除系统目录下的my.ini文件, 把下面的内容重新写入my.ini文件试试, 要适当地改 ...
- Bootstrap modal垂直居中
Bootstrap modal垂直居中 在网上看到有Bootstrap2的Modal dialog垂直居中问题解决方法,这种方法自己试了一下,并不能完全居中,并且窗口的大小不一样的话,每次显示的m ...
- C#文本选中及ContextMenuStrip菜单使用
'文本框选中显示'TextBox1.SelectAll()选择所有文本'textBox1.Text.Insert(start,strInsertText)指定位置添加文本1 Private Sub T ...
- inline函数的用法
在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间或是叫栈内存的问题,特别的引入了inline修饰符,表示为内联函数.栈空间就是指放置程式的局部数据也就是函数内数据的内存空间,在系统下,栈空间 ...
- 【leetcode】Binary Tree Zigzag Level Order Traversal (middle)
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...
- osg::NodeVisitor中计算一个节点对应的世界变换矩阵、法向量、顶点坐标
class MyNodeVisitor:public osg::NodeVisitor { pulic: MyNodeVisitor():osg::NodeVisitor(osg::NodeVisit ...