dmt、lmt、mssm,assm 总结

LMTDMT下存储参数的异同 假设当前数据库的DB_BLOCK_SIZE为D(K),建表的DDL设定了INITIAL为T,MINEXTENTS为S,PCTINCREASE为P,NEXT为N本文的DB_BLOCK_SIZE=8K[@more@]假设当前数据库的... 阅读详情

 dmtlmtmssmassm总结

表空间是由段(segment)组成的,段是由范围(extent)组成的,范围是由连续的(block)组成的。这里也可以通过一幅众所周知的图来表示:当在表空间里创建一个tableindex等对象时其实对我们使用者而言称其为对象,但是从oracle存储的角度来说把它称其为segment。我们都知道oracle最小的读写单位是block,但是在为对象分配空间时单位却是extent,这样做的好处其实就是为了提高效率。上面提到段是由范围组成的,当一个extent被分配给一个segment时,和segment对应的对象就可以使用空间,用户或许从来都不会关心oracle内部到底是如何标记这个extnet是属于哪个segment的甚至也可能不会关心这个extent到底是属于哪一个datafile的,但是对oracle而言,这却是一件非常重要的事情。oracle需要一种机制来跟踪或者记录一个数据文件中extent的使用、空闲情况。Dmt,lmt就是针对表空间中extent是如何被管理(记录extentfreeused使用情况)而言的
1
dmt (dictionary managed tablespace)oracle9.2开始,defaulttablespace都是lmt的,而且也不支持创建dmt类型的表空间了
除非在创建数据库时选择定制把system tablespace的区管理类型改成在字典中管理,否则在system tablespace类型是local的情况下是不支持创建dmt类型的表空间了。另外值得一提的是从9.2开始,即使在创建db时指定temp tbs为字典管理的,通过dbca创建时可以指定,但是创建之后还是发现它是local管理的;使用命令创建时直接会报错
undo tbs
在通过dbca建库时也不允许指定为dictionary类型

说了半天,到底什么是Dmt,其实非常容易理解,当在tbs上创建segment时,表空间里相应的数据文件中
extent是被使用了还是处于空闲是记录在两个数据字典表中(uet$:used extentfet$:free extent)
也就是说Oracle updates the appropriate tables in the data dictionary whenever an extent is
allocated, or freed for reuse.
需要注意的是查询这两个表需要sys用户。
SQL> create table t(id int) tablespace dmt;
Table created.
SQL> select * from uet$ where segfile#<>1;
SEGFILE# SEGBLOCK# EXT# TS# FILE# BLOCK# LENGTH
---------- ---------- ---------- ---------- ---------- ---------- ----------
5 2 0 5 5 2 5
uet$
字段简要介绍:
SEGFILE# segment header block
所在的数据文件编号,对应dba_segments.header_file
SEGBLOCK# segment header block
编号,对应dba_segments.header_block
EXT# extent
编号 对应dba_extents.extent_id
TS# tbs
编号 对应v$tablespace.ts#
FILE# extent
所在的datafile编号,对应dba_data_file.file_id
BLOCK# extent
的起始block编号,dba_extents.block_id
LENGTH
extentblock#开始所包含的block的数量,对应dba_extents.blocks
SQL> select * from fet$ ;
TS# FILE# BLOCK# LENGTH
---------- ---------- ---------- ----------
0 1 13864 5337
5 5 7 186
fet$ 字段简要介绍:
TS#
同上
FILE#
同上
BLOCK#
数据文件file#free block开始位置
LENGTH free block
的长度,block的数量
在创建dmt tbs时指定的数据文件大小是3m
SQL> select 3*1024*1024/16384 from dual;
3*1024*1024/16384
-----------------
192
SQL>
192block - uet$得知的从第二个block开始该extent总共包含5block26),也就是fet$
中显示的从第7block开始的186192 - 7+1)个free block
这种管理extent的方式存在的严重问题就是并发性支持很弱,因为在用户使用对象的过程中只要涉及到
extent
的分配或者回收。oracle内部都会对这两个表进行修改,对象越大,涉及到的extent数量越多,对
这两个表修改锁定( ST (space transaction) lock )的时间就越长。如果并发用户再要多,这两个表
上的资源争夺可想而知。另外在修改uet$fet$的同时本身也是需要undoredo的,而占用的undoredo
和修改普通表没有什么两样,因此对undoredo资源本身也是一个冲击。oracle也意识到了Dmt存在的严
重缺陷,于是从9.2开始推出了lmt
另外在创建dmt时可以设置控制extent变化的storage参数,这些参数对tbs而言本身没有太多意义,它的
作用在于在tbs中为segmeng分配extentextent的变化情况
SQL> create tablespace dmt1 datafile 'E:ORACLEPRODUCT10.2.0ORADATADMTDMT01
.DBF' SIZE 10M default storage(
2 initial 64k
3 next 128k
4 pctincrease 50
5 minextents 1
6 maxextents unlimited
7 )
8 extent management dictionary;
表空间已创建。
SQL> create table t_dmt1(id int) tablespace dmt1;
表已创建。
SQL> COL TABLE_NAME FORMAT A10
SQL> SELECT TABLE_NAME , INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,MAX_EXTENTS,PCT_
INCREASE FROM DBA_TABLES WHERE TABLE_NAME='T_DMT1';
TABLE_NAME INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE
---------- -------------- ----------- ----------- ----------- ------------
T_DMT1 65536 131072 1 2147483645 50
SQL>
我们清楚的看到创建在dmt1表空间上的表t_dmt1完全使用了dmt1上的default storage参数,当然也可以
在建表时在table上指定storage参数,这里不在赘述,有机会介绍table时再做介绍。
2
lmt (locally managed tablespace)
lmt在记录extent是否是free还是used是通过在数据文件开头的几个block中通过bit位来记录的。
数据库中如果不存在dmt类型的表空间,则uet$fet$中不在有信息。
SQL> select count(*) from uet$;
COUNT(*)
----------
0
SQL> select count(*) from fet$;
COUNT(*)
----------
0
SQL>
下面创建一个tbs来测试一下:
SQL> create tablespace lmt datafile 'E:ORACLEPRODUCT10.2.0ORADATATESTlmt.d
bf' size 5m;
表空间已创建。
SQL> create table t(id int) tablespace lmt ;
表已创建。
SQL> COL segment_name format a3
SQL> select segment_name , extent_id , file_id , block_id , blocks from dba_exte
nts where segment_name='T' AND owner='SYS';
SEG EXTENT_ID FILE_ID BLOCK_ID BLOCKS
--- ---------- ---------- ---------- ----------
T 0 5 9 8
SQL>
BLOCK_ID=9我们知道oracle是从第9block开始给用户使用的,那么188block都是做什么的?众所
周知第一个blockdatafile header,接下来我们dump 28
摘录dump部分内容如下:
Start dump data blocks tsn: 14 file#: 5 minblk 2 maxblk 8
buffer tsn: 14 rdba: 0x01400002 (5/2)
scn: 0x0000.0014eff2 seq: 0x02 flg: 0x04 tail: 0xeff21d02
frmt: 0x02 chkval: 0xba0e type: 0x1d=KTFB Bitmapped File Space Header
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x04DC2200 to 0x04DC4200
4DC2200 0000A21D 01400002 0014EFF2 04020000 [......@.........]
4DC2210 0000BA0E 00000005 00000008 00000280 [................]
4DC2220 00000001 00000000 00000000 00000007 [................]
4DC2230 00000280 00000001 0000004E 00000000 [........N.......]
4DC2240 00000000 00000000 00000000 00000000 [................]
4DC2250 00000009 00000008 00000000 00000000 [................]
4DC2260 00000000 00000000 00000000 00000000 [................]
Repeat 504 times
4DC41F0 00000000 00000000 00000000 EFF21D02 [................]
File Space Header Block:
Header Control:
RelFno: 5, Unit: 8, Size: 640, Flag: 1
AutoExtend: NO, Increment: 0, MaxSize: 0
Initial Area: 7, Tail: 640, First: 1, Free: 78
Deallocation scn: 0.0
Header Opcode:
Save: No Pending Op
buffer tsn: 14 rdba: 0x01400003 (5/3)
scn: 0x0000.0014eff2 seq: 0x01 flg: 0x04 tail: 0xeff21e01
frmt: 0x02 chkval: 0x4eba type: 0x1e=KTFB Bitmapped File Space Bitmap
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x04DC2200 to 0x04DC4200
4DC2200 0000A21E 01400003 0014EFF2 04010000 [......@.........]
4DC2210 00004EBA 00000005 00000009 00000000 [.N..............]
4DC2220 00000001 0000F7FF 00000000 00000000 [................]
4DC2230 00000000 00000000 00000001 00000000 [................]
4DC2240 00000000 00000000 00000000 00000000 [................]
Repeat 506 times
4DC41F0 00000000 00000000 00000000 EFF21E01 [................]
File Space Bitmap Block:
BitMap Control:
RelFno: 5, BeginBlock: 9, Flag: 0, First: 1, Free: 63487
0100000000000000 0000000000000000
..................................
其中第二个block

type: 0x1d=KTFB Bitmapped File Space Header

以及内容

File Space Header Block:
Header Control:
RelFno: 5, Unit: 8, Size: 640, Flag: 1
AutoExtend: NO, Increment: 0, MaxSize: 0
Initial Area: 7, Tail: 640, First: 1, Free: 78 ....&quot;
记录的显然是数据文件的信息,不过我也疑惑这部
分内容为什么不记录在第一个block中?
38其类型都是:type: 0x1e=KTFB Bitmapped File Space Bitmap,显然这6block是真真代替uet$
fet$来记录extent的使用、空闲状态的,接下来看看是如何记录的:
3block的信息
01000000.................... ;
16进制数,转为二进制有意义的信息是:0000 0001,
其中只有1&quot;1&quot;表示的正是164kextent;下面创建一个拥有多个extentssegment看看效果:
SQL> create table tt(id int) storage(initial 2m) tablespace lmt;
表已创建。
SQL> select count(*) from dba_extents where owner='SYS' AND segment_name='TT';
COUNT(*)
----------
2
SQL> alter system dump datafile 5 block 3;
系统已更改。
主要信息摘录如下:
0100FFFFFFFF0000
转为为二进制:
0000 0001 0000 0000 1111 1111 1111 1111 1111 1111 1111 1111
其中0000 0001代表的就是表t所使用的extent,而后面的321代表的就是3264kextent,正好是2m
当然在dba_extents中显示的是2extent,而oracle在标记的时候始终是以64k为单位标记的。至此lmt
如何记录extentfree used想必已经很清楚了。
SQL> select 32*64 from dual;
32*64
----------
2048
SQL>
另外在创建lmt类型的tbs时不再支持default storage这些参数,取而代之是autoallocate以及uniform
default
的是autoallocateautoallocate分配extent的原则是:
segment<=1m ,
64k为单位分配extent
segment<=64m ,
1m为单位分配extent
segment<=1g ,
8m为单位分配extent
segment>1g ,
64m为单位分配extent.
其实autoallocatedmt时的pctincrease强不到哪儿去,尤其是当segment>1g之后,分配extent对连续空间的请求
是很大的,因此建议当segmeng很大时最好使用unifom。以免造成系统还有很多空闲空间时结果系统还是
报不能扩展...错误。
另外system tbs必须是autoallocate,不能是uniform类型的。
3
dmtlmt的相互转化
  
待续。。。

4
mssm (manual segment space management)
dmt,lmt
是管理segment中的extent的,而mssmassm是管理extent中的block的。mssm是通过segment
header
上的freelist 列表在管理extent上处于hwm(high warter mark)下的那些没有达到pctfree和曾经
达到过pctfree但是后来由于delete等操作空间又紧缩下降到pctused的那些来自不同extentblock所组
成的(docA free list is a list of free data blocks that usually includes blocks existing
in a number of different extents within the segment. Free lists are composed of blocks in
which free space has not yet reached PCTFREE or used space has shrunk below PCTUSED. Specify
the number of process free lists with the FREELISTS parameter. The default value of
FREELISTS is one. The maximum value depends on the data block size.
)。使用mssm来管理block
需要在创建表空间时指定manual segment space management语句:
SQL> create tablespace mssm datafile 'E:ORACLEPRODUCT10.2.0ORADATATESTmssm
.dbf' size 3m segment space management manual;
表空间已创建。
SQL>
需要说明的时不论在dmt还时lmt下都可以使用mssm,而在dmt下只能使用mssm,而下面要介绍的assm
lmt下才支持。
了解了mssm的机制之后,使用上具体表现在创建segment时需要说明pctused , freelists, freelist
groups
参数,当然如果不设置这些参数系统会使用default值。简单的做个测试:
SQL> create table t( id int ,name char(1000))
2 storage(
3 freelists 1
4 freelist groups 1
5 )
6 pctfree 50
7 pctused 50
8 tablespace mssm;
表已创建。
SQL>
这里指定了freelists=1 freelist groups=1 其实他们的default值也都是1,只是给出大家语法而已,另
pctfree pctuseddefault值是1040。这个值是个百分数,pctfree 表示blockfree空间要保留
blcok
大小的pctfree,其目的当然就是避免事后由于update操作造成行迁移。行迁移的内容这里暂时不会
多讲。正常情况下,如果hwm下一个block的使用空间没有达到block_size*(1-pctfree),那么这个block
终是在freelists列表上的,如果使用空间达到了block_size*(1-pctfree),那么这个block脱离了
freelists
列表;如果这个block上的数据后来由于各种操作(诸如delete等)数据在较少以至于占用的空间小于block_size*pctused了,那么这个block又重新回到了freelists列表上,意味着在freelists列表上的block都有空闲空间供我们使用
,如果segment上要存储数据,oracle优先使用freelists列表上的block,当然append方式插入数据除外
。有关pctfree pctused这里有段话说得很精辟(PCTFREE specifies the percentage of a data
block to be reserved (kept free) for possible updates to rows that already are contained in
that block. After a block becomes full, as determined by PCTFREE, Oracle does not consider
the block is for the insertion of new rows until the percentage of the block being used
falls below the parameter PCTUSED.

简单的做个测试:
SQL> insert into t values(1 , 'a');
已创建 1 行。
SQL> insert into t values(2 , 'b');
已创建 1 行。
SQL> insert into t values(3 , 'c');
已创建 1 行。
SQL> insert into t values(4 , 'd');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select id , substr(name , 1 , 1) , rowid from t;
ID SU ROWID
---------- -- ------------------
1 a AAACdCAAGAAAAAKAAA
2 b AAACdCAAGAAAAAKAAB
3 c AAACdCAAGAAAAAKAAC
4 d AAACdCAAGAAAAALAAA
SQL> show parameter db_block_size
NAME TYPE VALUE
------------------------------------ ----------- --------------------
db_block_size integer 8192
SQL> analyze table t compute statistics;
表已分析。
SQL> select num_rows,blocks,empty_blocks, num_freelist_blocks
2 from dba_tables where table_name='T' and owner='SYS';
NUM_ROWS BLOCKS EMPTY_BLOCKS NUM_FREELIST_BLOCKS
---------- ---------- ------------ -------------------
4 2 5 1
SQL> delete from t where id=1;
已删除 1 行。
SQL> commit;
提交完成。
SQL> analyze table t compute statistics;
表已分析。
SQL> select num_rows,blocks,empty_blocks, num_freelist_blocks
2 from dba_tables where table_name='T' and owner='SYS';
NUM_ROWS BLOCKS EMPTY_BLOCKS NUM_FREELIST_BLOCKS
---------- ---------- ------------ -------------------
3 2 5 2
SQL>
通过上面试验(看rowid的变化,当然需要了解rowid,这里篇幅所限,rowid不做介绍,可能以后会专门
介绍rowid)我们清晰的看到一个block上只能存放3条数据,插入第4条时使用了另外一个blcok,对表分
析之后发现
NUM_FREELIST_BLOCKS(该字段表示freelistsblock的数量)=1,说明freelists上只有1
block
,而这个block正是数据id4所在的block,前3条数据所在block由于使用空间达到了8k*(1-
pctfree)=8k*0.5=4k
,因此从freelist上脱离了,之后删除了id1这条数据之后,这个block上存在2条数
据,其占用的空间大约就是2k多一点,小于8k*pctused=8k*0.5=4k,因此这个blcok又回到了freelists
,分析表之后显示的NUM_FREELIST_BLOCKS2也正好说明了这一点。
继续插入数据:
SQL> select id , substr(name , 1 , 1) , rowid from t;
ID SU ROWID
---------- -- ------------------
2 b AAACdCAAGAAAAAKAAB
3 c AAACdCAAGAAAAAKAAC
4 d AAACdCAAGAAAAALAAA
SQL> insert into t values(5 , 'e');
已创建 1 行。
SQL> select id , substr(name , 1 , 1) , rowid from t;
ID SU ROWID
---------- -- ------------------
2 b AAACdCAAGAAAAAKAAB
3 c AAACdCAAGAAAAAKAAC
4 d AAACdCAAGAAAAALAAA
5 e AAACdCAAGAAAAALAAB
SQL> insert into t values(6 , 'f');
已创建 1 行。
SQL> select id , substr(name , 1 , 1) , rowid from t;
ID SU ROWID
---------- -- ------------------
2 b AAACdCAAGAAAAAKAAB
3 c AAACdCAAGAAAAAKAAC
4 d AAACdCAAGAAAAALAAA
5 e AAACdCAAGAAAAALAAB
6 f AAACdCAAGAAAAALAAC
SQL> insert into t values(7 , 'g');
已创建 1 行。
SQL> select id , substr(name , 1 , 1) , rowid from t;
ID SU ROWID
---------- -- ------------------
7 g AAACdCAAGAAAAAKAAA
2 b AAACdCAAGAAAAAKAAB
3 c AAACdCAAGAAAAAKAAC
4 d AAACdCAAGAAAAALAAA
5 e AAACdCAAGAAAAALAAB
6 f AAACdCAAGAAAAALAAC
已选择6行。
SQL> commit;
提交完成。
我们通过观察rowid的变化发现oracle优先使用了freelists上的block,并没有分配新的block。当然也可
以通过analyze之后看hwm之下block的数量也是2来断定。不过这次发现NUM_FREELIST_BLOCKS这个时候是1
而不是我们期望的0
SQL> analyze table t compute statistics;
表已分析。
SQL> select num_rows,blocks,empty_blocks, num_freelist_blocks
2 from dba_tables where table_name='T' and owner='SYS';
NUM_ROWS BLOCKS EMPTY_BLOCKS NUM_FREELIST_BLOCKS
---------- ---------- ------------ -------------------
6 2 5 1
继续插入数据观察一下倒是没有发现问题:
SQL> insert into t values(8 , 'h');
已创建 1 行。
SQL> commit;
提交完成。
SQL> analyze table t compute statistics;
表已分析。
SQL> select num_rows,blocks,empty_blocks, num_freelist_blocks
2 from dba_tables where table_name='T' and owner='SYS';
NUM_ROWS BLOCKS EMPTY_BLOCKS NUM_FREELIST_BLOCKS
---------- ---------- ------------ -------------------
7 3 4 1
SQL>
为什么上面hwm下没有了free block,而NUM_FREELIST_BLOCKS1不是0,请看下面的测试:
SQL> select id , substr(name , 1 , 1) , rowid,ROWNUM , dbms_rowid.rowid_block_nu
mber(rowid) block_number from t;
ID SU ROWID ROWNUM BLOCK_NUMBER
---------- -- ------------------ ---------- ------------
7 g AAACdCAAGAAAAAKAAA 1 10
4 d AAACdCAAGAAAAAKAAD 2 10
5 e AAACdCAAGAAAAAKAAE 3 10
4 d AAACdCAAGAAAAALAAA 4 11
5 e AAACdCAAGAAAAALAAB 5 11
6 f AAACdCAAGAAAAALAAC 6 11
8 h AAACdCAAGAAAAAMAAA 7 12
9 i AAACdCAAGAAAAAMAAB 8 12
7 g AAACdCAAGAAAAAMAAC 9 12
6 f AAACdCAAGAAAAANAAA 10 13
8 h AAACdCAAGAAAAANAAB 11 13
ID SU ROWID ROWNUM BLOCK_NUMBER
---------- -- ------------------ ---------- ------------
9 i AAACdCAAGAAAAANAAC 12 13
已选择12行。
SQL> select num_rows,blocks,empty_blocks, num_freelist_blocks
2 from dba_tables where table_name='T' and owner='SYS';
NUM_ROWS BLOCKS EMPTY_BLOCKS NUM_FREELIST_BLOCKS
---------- ---------- ------------ -------------------
12 4 3 1
SQL> ALTER system dump datafile 6 block 9;
系统已更改。
查看dump文件freelists中相关内容发现:SEG LST:: flg: USED lhd: 0x0180000d ltl: 0x0180000d

freelists
上的这个block13,也就是说block13是最后一个满了的,最后一个虽然满了,但是在没有新
blck加入到freelists上之前这个block是不会从freelists上消失的。
继续插入数据:
SQL> insert into t values(10,'j');
已创建 1 行。
SQL> commit;
提交完成。
SQL> analyze table t compute statistics;
表已分析。
SQL> select num_rows,blocks,empty_blocks, num_freelist_blocks
2 from dba_tables where table_name='T' and owner='SYS';
NUM_ROWS BLOCKS EMPTY_BLOCKS NUM_FREELIST_BLOCKS
---------- ---------- ------------ -------------------
13 5 2 1
SQL> ALTER system dump datafile 6 block 9;
系统已更改。
查看dump内容:SEG LST:: flg: USED lhd: 0x0180000e ltl: 0x0180000e
发现这次freelists上的block是为新插入数据分配的14block13blockfreelists脱离了,那么什
么时候
NUM_FREELIST_BLOCKS
0,当hwm下没有block时:
SQL> truncate table t;
表被截断。
SQL> analyze table t compute statistics;
表已分析。
SQL> select num_rows,blocks,empty_blocks, num_freelist_blocks
2 from dba_tables where table_name='T' and owner='SYS';
NUM_ROWS BLOCKS EMPTY_BLOCKS NUM_FREELIST_BLOCKS
---------- ---------- ------------ -------------------
0 0 7 0
SQL>
mssm就是这样一种机制来管理block的空闲和使用情况的,这种方式管理block存在的缺陷主要就是当并发
用户针对同一个segment请求空闲空间比较多时,会在segment header上的freelists上争夺激烈,具体tom
出的引水机的例子非常贴切,大家可以查看tom的力作。
有关freelists freelist groups的深入了解也可以看以下几位大师的精彩讨论:
<a href="http://tech.it168.com/o/2006-04-11/200604112314992.shtml" target="_blank">http://tech.it168.com/o/2006-04-11/200604112314992.shtml</a>
5
assm (automatic segment space management)
在介绍mssm时提到mssm主要是对并发性的支持不是很好,如果并发用户同时在同一个segment上请求空间
时在segment header会发生对freelists列表的争夺,基于此在lmtoracle建议我们使用assm,看看
oracle doc
是如何来解释assm的:
This keyword tells Oracle that you want to use bitmaps to manage the free space within
segments. A bitmap, in this case, is a map that describes the status of each data block
within a segment with respect to the amount of space in the block available for inserting
rows. As more or less space becomes available in a data block, its new state is reflected in
the bitmap. Bitmaps enable Oracle to manage free space more automatically; thus, this form
of space management is called automatic segment-space management.
Locally managed tablespaces using automatic segment-space management can be created as
smallfile (traditional) or bigfile tablespaces. AUTO is the default.

以上doc是来之10.2,最后提到AUTO is the default.这是指10g的情况,在9imanualdefault的,下
面看一下如何创建assm模式下的表空间:
SQL> create tablespace assm datafile 'E<img src="images/smilies/33.gif" smilieid="204" border="0" alt="" />racleproduct10.2.0oradatatestassm
.dbf' size 5m extent management local segment space manageme
nt auto;
表空间已创建。
SQL> select tablespace_name , extent_management , segment_space_management from
dba_tablespaces ;
TABLESPACE_NAME EXTENT_MAN SEGMEN
------------------------------ ---------- ------
SYSTEM LOCAL MANUAL
UNDOTBS1 LOCAL MANUAL
SYSAUX LOCAL AUTO
TEMP LOCAL MANUAL
ASSM LOCAL AUTO
SQL>
在创建表空间assm的语法中其实可以省略&quot;extent management local segment space manageme
nt auto&quot;,
因为在10gdefault的就是lmtassm类型的。
下面来看看assm内部到底是如何通过block来实现利用bitmap管理segmentblock的空闲和使用情况的。
测试如下:
SQL> create table tt tablespace assm as select * from dba_objects;
表已创建。
SQL> select EXTENT_ID , FILE_ID , BLOCK_ID , BLOCKS from dba_extents where segme
nt_name='TT';
EXTENT_ID FILE_ID BLOCK_ID BLOCKS
---------- ---------- ---------- ----------
0 7 9 8
1 7 17 8
2 7 25 8
3 7 33 8
4 7 41 8
5 7 49 8
6 7 57 8
7 7 65 8
8 7 73 8
9 7 81 8
10 7 89 8
11 7 97 8
12 7 105 8
13 7 113 8
14 7 121 8
15 7 129 8
16 7 137 128
已选择17行。
SQL> select header_file,header_block,blocks,extents from dba_segments where segm
ent_name='TT';
HEADER_FILE HEADER_BLOCK BLOCKS EXTENTS
----------- ------------ ---------- ----------
7 11 256 17
SQL>
HEADER_BLOCK 显示的是11segment header),而extent_id=0也就是说第一个extent是从第9block
始的,那么910这两个block到底做什么用了,dump下看看:
SQL> alter system dump datafile 7 block min 9 block max 11;
系统已更改。
dump
主要内容摘录如下:(大家在阅读时可以跳过这部分内容,看下面阅读时需要的时候上来再看)
--===================================
Start dump data blocks tsn: 15 file#: 7 minblk 9 maxblk 11
buffer tsn: 15 rdba: 0x01c00009 (7/9)
scn: 0x0000.001607e3 seq: 0x03 flg: 0x04 tail: 0x07e32003
frmt: 0x02 chkval: 0xa169 type: 0x20=FIRST LEVEL BITMAP BLOCK
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x07082200 to 0x07084200
...........
Dump of First Level Bitmap Block
--------------------------------
nbits : 4 nranges: 2 parent dba: 0x01c0000a poffset: 0
unformatted: 0 total: 16 first useful block: 3
owning instance : 1
instance ownership changed at
Last successful Search
Freeness Status: nf1 0 nf2 0 nf3 0 nf4 0
Extent Map Block Offset: 4294967295
First free datablock : 16
Bitmap block lock opcode 0
Locker xid: : 0x0000.000.00000000
Inc #: 0 Objd: 10056
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x01c00009 Length: 8 Offset: 0
0x01c00011 Length: 8 Offset: 8
0:Metadata 1:Metadata 2:Metadata 3:FULL
4:FULL 5:FULL 6:FULL 7:FULL
8:FULL 9:FULL 10:FULL 11:FULL
12:FULL 13:FULL 14:FULL 15:FULL
--------------------------------------------------------
buffer tsn: 15 rdba: 0x01c0000a (7/10)
scn: 0x0000.001607e3 seq: 0x09 flg: 0x04 tail: 0x07e32109
frmt: 0x02 chkval: 0xa07c type: 0x21=SECOND LEVEL BITMAP BLOCK
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x07082200 to 0x07084200
.................
Dump of Second Level Bitmap Block
number: 10 nfree: 2 ffree: 8 pdba: 0x01c0000b
Inc #: 0 Objd: 10056
opcode:0
xid:
L1 Ranges :
--------------------------------------------------------
0x01c00009 Free: 1 Inst: 1
0x01c00019 Free: 1 Inst: 1
0x01c00029 Free: 1 Inst: 1
0x01c00039 Free: 1 Inst: 1
0x01c00049 Free: 1 Inst: 1
0x01c00059 Free: 1 Inst: 1
0x01c00069 Free: 1 Inst: 1
0x01c00079 Free: 1 Inst: 1
0x01c00089 Free: 5 Inst: 1
0x01c0008a Free: 5 Inst: 1
--------------------------------------------------------
buffer tsn: 15 rdba: 0x01c0000b (7/11)
scn: 0x0000.001607e5 seq: 0x01 flg: 0x04 tail: 0x07e52301
frmt: 0x02 chkval: 0x8d53 type: 0x23=PAGETABLE SEGMENT HEADER
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x07082200 to 0x07084200
.............
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 17 #blocks: 256
last map 0x00000000 #maps: 0 offset: 2716
Highwater:: 0x01c0008c ext#: 16 blk#: 3 ext size: 128
#blocks in seg. hdr's freelists: 0
#blocks below: 131
mapblk 0x00000000 offset: 16
Unlocked
--------------------------------------------------------
Low HighWater Mark :
Highwater:: 0x01c0008c ext#: 16 blk#: 3 ext size: 128
#blocks in seg. hdr's freelists: 0
#blocks below: 131
mapblk 0x00000000 offset: 16
Level 1 BMB for High HWM block: 0x01c00089
Level 1 BMB for Low HWM block: 0x01c00089
--------------------------------------------------------
Segment Type: 1 nl2: 1 blksz: 8192 fbsz: 0
L2 Array start offset: 0x00001434
First Level 3 BMB: 0x00000000
L2 Hint for inserts: 0x01c0000a
Last Level 1 BMB: 0x01c0008a
Last Level II BMB: 0x01c0000a
Last Level III BMB: 0x00000000
Map Header:: next 0x00000000 #extents: 17 obj#: 10056 flag: 0x10000000
Inc # 0
Extent Map
-----------------------------------------------------------------
0x01c00009 length: 8
0x01c00011 length: 8
0x01c00019 length: 8
0x01c00021 length: 8
0x01c00029 length: 8
0x01c00031 length: 8
0x01c00039 length: 8
0x01c00041 length: 8
0x01c00049 length: 8
0x01c00051 length: 8
0x01c00059 length: 8
0x01c00061 length: 8
0x01c00069 length: 8
0x01c00071 length: 8
0x01c00079 length: 8
0x01c00081 length: 8
0x01c00089 length: 128
Auxillary Map
--------------------------------------------------------
Extent 0 : L1 dba: 0x01c00009 Data dba: 0x01c0000c
Extent 1 : L1 dba: 0x01c00009 Data dba: 0x01c00011
Extent 2 : L1 dba: 0x01c00019 Data dba: 0x01c0001a
Extent 3 : L1 dba: 0x01c00019 Data dba: 0x01c00021
Extent 4 : L1 dba: 0x01c00029 Data dba: 0x01c0002a
Extent 5 : L1 dba: 0x01c00029 Data dba: 0x01c00031
Extent 6 : L1 dba: 0x01c00039 Data dba: 0x01c0003a
Extent 7 : L1 dba: 0x01c00039 Data dba: 0x01c00041
Extent 8 : L1 dba: 0x01c00049 Data dba: 0x01c0004a
Extent 9 : L1 dba: 0x01c00049 Data dba: 0x01c00051
Extent 10 : L1 dba: 0x01c00059 Data dba: 0x01c0005a
Extent 11 : L1 dba: 0x01c00059 Data dba: 0x01c00061
Extent 12 : L1 dba: 0x01c00069 Data dba: 0x01c0006a
Extent 13 : L1 dba: 0x01c00069 Data dba: 0x01c00071
Extent 14 : L1 dba: 0x01c00079 Data dba: 0x01c0007a
Extent 15 : L1 dba: 0x01c00079 Data dba: 0x01c00081
Extent 16 : L1 dba: 0x01c00089 Data dba: 0x01c0008b
--------------------------------------------------------
Second Level Bitmap block DBAs
--------------------------------------------------------
DBA 1: 0x01c0000a
End dump data blocks tsn: 15 file#: 7 minblk 9 maxblk 11
--==================================================================
其中在第9blockdump信息中我们发现type: 0x20=FIRST LEVEL BITMAP BLOCK,说明这个block是第一
bitmap blockoracle用第一级bitmap block来管理data block的使用情况:
 --------------------------------------------------------
  DBA Ranges :
  --------------------------------------------------------
   0x01c00009  Length: 8      Offset: 0     
   0x01c00011  Length: 8      Offset: 8     
 
   0:Metadata   1:Metadata   2:Metadata   3:FULL
   4:FULL   5:FULL   6:FULL   7:FULL
   8:FULL   9:FULL   10:FULL   11:FULL
   12:FULL   13:FULL   14:FULL   15:FULL
  --------------------------------------------------------
从上面内容(来自block 9dump)发现9block总共管理了16block,也就是2extent。由于extent
是由连续的block组成的,因此只需要记录每个extent的起始block地址(0x01c00009)block的数量即可

两个16进制的dba转化为10进制的分别是:
SQL> select dbms_utility.data_block_address_block(to_number('01c00009','xxxxxxxx
')) from dual;
DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(TO_NUMBER('01C00009','XXXXXXXX'))
-----------------------------------------------------------------------
9
SQL> select dbms_utility.data_block_address_block(to_number('01c000011','xxxxxxx
xx')) from dual;
DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(TO_NUMBER('01C000011','XXXXXXXXX'))
-------------------------------------------------------------------------
17
SQL>
block 917不正是我们上面查询dba_extents是显示的extent_id = 0 , 1两个extent
另外9 block dump信息中的:
0:Metadata   1:Metadata   2:Metadata  
表示9#~11block显示的是Metadata(元数据:数据仓库中非常重要的概念,管理数据的数据,oracle
的数据字典据都可以理解成元数据),其中0表示是9block1 表示10block2 表示11block
segment header),其他显示的都是full,表示这些block上都已经没有可用的空闲空间。同时也发现
我们真真使用数据是从12block开始的。
9
block dump内容里还有一个重要的信息就是parent dba:  0x01c0000a表示9blockparent block
的地址,而这个block的地址正好是10block的地址:rdba: 0x01c0000a
至此9block暂时分析完毕。
--==================================
再来10block
10
block的类型是:type: 0x21=SECOND LEVEL BITMAP BLOCK
说明该block是二级bitmap block,他是用来管理一级bitmap block的。
10
block的主要dump信息:
L1 Ranges :
  --------------------------------------------------------
   0x01c00009  Free: 1 Inst: 1
   0x01c00019  Free: 1 Inst: 1
   0x01c00029  Free: 1 Inst: 1
   0x01c00039  Free: 1 Inst: 1
   0x01c00049  Free: 1 Inst: 1
   0x01c00059  Free: 1 Inst: 1
   0x01c00069  Free: 1 Inst: 1
   0x01c00079  Free: 1 Inst: 1
   0x01c00089  Free: 5 Inst: 1
   0x01c0008a  Free: 5 Inst: 1
 
  --------------------------------------------------------
其中L1 Ranges 中的那些dba转为10进制如下:
9
25
41
57
73
89
105
121
137
138
这些值都是一级bitmap blockblock_id,而这些值不正是dba_extents中显示的,同时也看到每一个一
bitmap block管理了16data block。不过奇怪的是为什么138block怎么也成了一级bitmap block
?暂时解释不清。
SQL> select block_id from dba_extents where segment_name='TT' AND mod(extent_id,
2)=0;
  BLOCK_ID
----------
9
25
41
57
73
89
105
121
137
已选择9行。
SQL>
再来看看10block pdba:     0x01c0000b,这个地址正是11blockdbardba: 0x01c0000b
接下来简单看看11block的类型是:
type: 0x23=PAGETABLE SEGMENT HEADER
也就是我们熟悉的segment header block,它同时也是一个特殊的三级bitmap block
11
block dupm内容最下面的一条非常有用的信息是:
 Second Level Bitmap block DBAs
   --------------------------------------------------------
   DBA 1:   0x01c0000a

记录了二级btimap block的地址(这里是10block),因为segment小,只有1个二级bitmap block,大家也可以创建一个大一
点的表,主要需要保证要有足够多的block才可能看到第二个二级block出现,要看到出现一个三级bitmap
block
可能非常的难。
感兴趣的话大家也可以参考eyglepiner两位版主的力作:
http://www.eygle.com/archives/2007/07/oracle_assm_level3_bmb.html
http://www.itpub.net/thread-734505-1-3.html
assm
就是通过3级别位图来管理segmentblock的使用和空闲情况的,可以浏览上面的连接(eygle的那个)有一副非常贴切的图。使用assm,不再需要设定参数pctused freelistsfreelist groups

 

 



dmtlmtmssm,assm的一点总结! 这几个名词涉及的内容实在是太多了,尽最大能力总结一下,希望能和大家一起分享!一下写不完,会不停的补充、完善!感觉比讲课还累:) 未完,不停的整理,修正,完善当中,欢迎大家拍砖![php]在了解dmtlmt之前,先来简单的熟悉一... 阅读详情

相关推荐

【听海日志】之data block物理结构

一、Data Block 物理结构图 二、对block的dump过程 1、dump block test@ORCL> create table test (a varchar(10)); Tabl...

1039

SqlServer专题

当使用连接池以后,执行Open()方法的时候,系统从连接池中提取一个现有的连接对象,这时打开的是一个物理逻辑连接如果连接池中的连接对象都被占用了,则会创建一个新的连接对象。当第一次访问时即建立5个连接,以后根据需要自动增加连接数量,但最多不超过规定的10个连接,如果超过10个并发请求时,在连接池之外建立连接对象,在连接池以外建立的连接关闭后会释放连接。连接池是DataProvider提供的一个机制,使得应用程序的链接保存在连接池中,而避免每次都要完成建立/关闭物理的连接的完成过程。

lingxiao16888的博客 1005

葵花宝典之java笔记

葵花宝典之java   一:面向对象的特征有哪些方面    1.  抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.  继承:继承是一种联结类的层次模型,并且才允的许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类

hujinhui51的专栏 3727

DMTLMTMSSMASSM

dmt,lmt是管理segment中的extent的,而mssmassm是管理extent中的block的。 1、dmt (dictionary managed tablespace)        表空间里相应的数据文件中的extent是被使用了还是处于空闲是记录在两个数据字典表中(uet$:used extent;fet$:free extent),也就是说Oracle updates

关注系统性能调优 3181

dmt,lmt,mssm,assm

1.  DMTOracle8i或之前是默认的,LMTOracle9i或之后的版本是默认的。备注: LMT,DMT是针对表空间中extent的管理.   在Oracle 8i之前,包括8i,一直用的是DMT(Dictionary ManagementTablespace)字典管理表空间,它工作的原理是向uet$(代表used-extent table)、fet$(代表free-exten

hugh 's Oracle 10g blog 1260

dmtlmtmssm,assm说明

在了解dmtlmt之前,先来简单的熟悉一下oracle数据库的逻辑结构,逻辑结构描速起来非常简单:表空 间是由段(segment)组成的,段是由范围(extent)组成的,范围是由连续的(block)组成的。这里也可以通 过一幅众所周知的图来表示: 当在表空间里创建一个table,index等对象时其实对我们使用者而言称其为对象,但是从oracle存储的角 度来说把它称其为segment...

weixin_30549657的博客 314

FREELIST, HWM , LMT, DMTASSM, MSSM

FREELIST, HWM , LMT, DMTASSM, MSSM 1. DMTOracle8i或之前是默认的,LMTOracle9i或之后的版本是默认的。备注: LMT,DMT是针对表空间中extent的管理....

cuixie2370的博客 234

dmtlmtmssmassm的一点总结

出自:warehouse.itpub.net 在了解dmtlmt之前,先来简单的熟悉一下oracle数据库的逻辑结构,逻辑结构描述起来非常简单:表空 间是由段(segment)组成的,段是由范围(extent)组成的,范围是由连续的(block)组成的。这里也可以通 过一幅众所周知的图来表示: 当在表空间里创建一个table,index等对象时其实对我们使用者

Chris的Oracle学习笔记 1888

oracle dmt,lmt,mssm,assm的含义

表空间是由段(segment)组成的,段是由范围(extent)组成的,范围是由连续的(block)组成的。这里也可以通过一幅众所周知的图来表示:当在表空间里创建一个table,index等对象时其实对我们使用者而言称其为对象,但是从oracle存储的角度来说把它称其为segment。我们都知道oracle最小的读写单位是block,但是在为对象分配空间时单位却是extent,这样做的好处其实就是

Laughing 2179

oracle mssm,关于oracle 中的dmt_lmt_mssm_assm其间的关系

在了解dmtlmt之前,先来简单的熟悉一下oracle数据库的逻辑结构,逻辑结构描速起来非常简单:表空间是由段(segment)组成的,段是由范围(extent)组成的,范围是由连续的(block)组成的。这里也可以通过一幅众所周知的图来表示:当在表空间里创建一个table,index等对象时其实对我们使用者而言称其为对象,但是从oracle存储的角度来说把它称其为segment。我们都知道or...

weixin_34331737的博客 574

关于oracle 中的dmt_lmt_mssm_assm之间的关系

在了解dmtlmt之前,先来简单的熟悉一下oracle数据库的逻辑结构,逻辑结构描速起来非常简单:表空间是由段(segment)组成的,段是由范围(extent)组成的,范围是由连续的(block)组成的。这里也可以通过一幅众所周知的图来表示: 当在表空间里创建一个table,index等对象时其实对我们使用者而言称其为对象,但是从oracle存储的角度来说把它称其为 segment。我...

nestazhang的专栏 389

77-Oracle 表空间管理(官方推荐)LMT-ASSM

SYSTEM表空间在10g前强制DMT,10g+可支持LMT(需创建时显式指定),从 11g 到 23ai,​新建的非系统表空间均默认启用 LMT+ASSM,不用显式声明。新建表空间直接默认是lmt+assm,从DMTLMT的演进,到了上云和多租户时代,最佳黄金搭档是LMT+ASSM了。 表空间管理方式对比​特性​​DMT​(已淘汰)​LMT​​管理位置​数据字典(SYSTEM表空间)数据文件头部位图​锁争用​高(enq: SQ - contention)无​碎片处理​需手动COALESCE自动合并​适用

远方的专栏 1147

LMT ASSM

可以认为这两个是Oracle空间分配和管理的相关内容要理解充分,对Oracle空间的理解和其他问题都有很好的帮助adm文档中表空间的部分也有部分lmt相关内容转载本地管理表空间——大家继续...

199

oracle表空间必须要有段,ORACLE表空间、段、区的管理方式

一、 ORACLE表空间管理ORACLE通过表空间为数据库提供使用空间。由于区(extent)是ORACLE创建对象时的最小分配单元, 所以表空间的管理实际上就是针对于区间的管理。ORACLE表空间的管理方式分为:1.1 字典管理方式(DMT):使用数据字典管理存储空间的分配, 当表空间分配新的区, 或者回收已分配的区时, ORACLE会对数据字典对应的表进行查询、更新, 且使用单线程, 速度慢,...

weixin_42099815的博客 283

Oracle数据库空间管理与监控核心技术实践

Oracle数据库空间管理是运维工作的核心环节,重点在于合理规划存储资源、优化性能并降低运维成本。摘要如下: 空间管理原则:避免预分配大量空闲空间,采用按需分配+动态监控模式,通过脚本实时掌握空间使用状态。 表空间区管理: 本地管理(LMT)优于数据字典管理(DMT),通过位图实现高效空间分配和碎片控制 支持AUTOALLOCATE自动分配或UNIFORM统一大小两种模式 表空间段管理: 自动段管理(ASSM)采用三级位图结构,优于手动管理(MSSM) 无需配置PCTUSED等参数,自动处理数据块分配和碎片

huanhuanzhou blog 749

深入探索Oracle数据库空间管理与监控

Oracle数据库空间管理摘要 数据库空间管理是Oracle稳定运行的关键,涉及表空间、数据文件等核心组件的全流程管控。核心要点: 分层架构:表空间→段→区→数据块→数据文件的五层管理模型,实现逻辑与物理存储的映射。 表空间管理: 推荐本地管理表空间(LMT)替代字典管理(DMT) 自动段管理(ASSM)显著优于手动管理(MSSM) 临时表空间组提升并行查询性能 自动撤销表空间简化回滚段管理 监控维护:通过自动化脚本监控空间使用率、碎片率和增长趋势,预防空间耗尽风险。 性能优化:合理配置区大小、启用段收缩功

huanhuanzhou blog 1179

测试2——表空间管理 段空间管理 段收缩测试

表空间的管理  --简要语法:     CREATE [BIGFILE | SMALLFILE] [TEMPORARY] TABLESPACE tablespace name     DATAFILE datafile spec | TEMPFILE tempfile spec     [MINIMUM EXTENT minimum extent size]   

changyanmanman的专栏 1485
上一篇: BinaryTree 书中的实现。
下一篇: 背包问题knapsack
easyjsf
博客等级 码龄17年 19粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值