LMT的探索-续
上一篇 / 下一篇 2008-02-26 17:32:37 / 个人分类:Oracle数据库技术-数据库管理
既然oracle推出了lmt的概念,在工作当中建立表空间的时候还是鼓励建立基于lmt的表空间,那么对于先前建立dmt表空间的默认存储参数default storage(initial next......)对于lmt来说已经不奏效,取而代之的就是那两种方式autoallocate和uniform. 在创建表空间的时候如果指定default storage并加带extent management子句的时候就会报错:
SQL> create tablespace mytest
2 datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\IRMDB\mytest.dbf' size 10M
3 default storage
4 (initial 100k
5 next 200k
6 minextents 10
7 maxextents 1000)
8 extent management local;
create tablespace mytest
*
第 1 行出现错误:
ORA-25143: 默认存储子句与分配策略不兼容
忽略extent management local子句,则创建成功
SQL> create tablespace mytest
2 datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\IRMDB\mytest.dbf' size 10M
3 default storage
4 (initial 100k
5 next 200k
6 minextents 10
7 maxextents 1000)
8 ;
表空间已创建。
但是表空间却不是按照我们创建时指定的default storage来生成的
SQL> select INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,MAX_EXTENTS,PCT_INCREASE
2 from dba_tablespaces
3 where tablespace_name='MYTEST';
INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE
-------------- ----------- ----------- ----------- ------------
65536 1 2147483645
依旧遵循了extent management local autoallocation的默认方式。
因此我们说lmt忽略了default storage的参数设置,只包含有两种extent的管理方式autoallocate和uniform.
如果我们创建uniform. size 3m类型的表空间:
-------------------------------------------------------------
那么extent的默认创建和next扩展的空间都固定为uniform. size的大小,如不指定size,默认为1M
SQL> create tablespace mytest
2 datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\IRMDB\mytest.dbf' size 10M
3 extent management local uniform. size 3M;
表空间已创建。
SQL> select INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,MAX_EXTENTS,PCT_INCREASE
2 from dba_tablespaces
3 where tablespace_name='MYTEST';
INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE
-------------- ----------- ----------- ----------- ------------
3145728 3145728 1 2147483645 0
SQL> create table t
2 (id int)
3 storage
4 (initial 8M)
5 tablespace mytest;
表已创建。
这个时候table t应该有初始3个3M extent大小的空间
SQL> select segment_name,EXTENT_ID,FILE_ID,BLOCK_ID,bytes,blocks from dba_extents where wner='SYS' and segment_name='T';
S EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
- ---------- ---------- ---------- ---------- ----------
T 2 14 777 3145728 384
T 1 14 393 3145728 384
T 0 14 9 3145728 384
SQL> alter system dump datafile 14 block 3; ---block 1,2都用于数据文件头,从block 3开始到block 8将用于移动位图
系统已更改。
转储后的结果
......
buffer tsn: 17 rdba: 0x03800003 (14/3)
scn: 0x0000.004024ed seq: 0x01 flg: 0x00 tail: 0x24ed1e01
frmt: 0x02 chkval: 0x0000 type: 0x1e=KTFB Bitmapped File Space Bitmap
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x06AD7600 to 0x06AD9600
6AD7600 0000A21E 03800003 004024ED 00010000 [.........$@.....]
6AD7610 00000000 0000000E 00000009 00000000 [................]
6AD7620 00000003 0000F7FD 00000000 00000000 [................]
6AD7630 00000000 00000000 00000007 00000000 [................]
6AD7640 00000000 00000000 00000000 00000000 [................]
Repeat 506 times
6AD95F0 00000000 00000000 00000000 24ED1E01 [...............$]
File Space Bitmap Block:
BitMap Control:
RelFno: 14, BeginBlock: 9, Flag: 0, First: 3, Free: 63485
0700000000000000 0000000000000000 0000000000000000 0000000000000000
......
我们看到十六进制的0700,就是二进制的011100000000
111就表示我们有3个3M的extent被占用。
如果我们创建autoallocate类型的表空间:
-----------------------------------------------------------
在创建表空间时如果不指定uniform,那默认default的是autoallocate
对于autoallocate方式,分配extent的原则是:
segment <= 1M allocate extent = 64k
segment <= 64M allocate extent = 1M
segment <= 1G allocate extent = 8M
segment > 1G allocate extent = 64M
根据以上分配原则,在segment很大的时候建议使用uniform方式
另外system表空间必须是autoallocate类型,不能是uniform的。
SQL> create tablespace mytest
2 datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\IRMDB\mytest.dbf' size 10M
3 extent management local;
表空间已创建。
SQL> select initial_extent,next_extent,min_extents,max_extents
2 pct_increase
3 from dba_tablespaces
4 where tablespace_name='MYTEST';
INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS PCT_INCREASE
-------------- ----------- ----------- ------------
65536 1 2147483645
根据上面区的分配原则如果创建了一个小于1M的段,那么每个extent的分配大小应该是64k
SQL> create table t
2 (id int)
3 storage
4 (initial 512K)
5 tablespace mytest;
表已创建。
SQL> select segment_name,EXTENT_ID,FILE_ID,BLOCK_ID,bytes,blocks from dba_extents where wner='SYS' and segment_name='T';
S EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS
- ---------- ---------- ---------- ---------- ----------
T 7 14 65 65536 8
T 6 14 57 65536 8
T 5 14 49 65536 8
T 4 14 41 65536 8
T 3 14 33 65536 8
T 2 14 25 65536 8
T 1 14 17 65536 8
T 0 14 9 65536 8
已选择8行。
SQL> alter system dump datafile 14 block 3;
系统已更改。
转储后的内容
......
Start dump data blocks tsn: 17 file#: 14 minblk 3 maxblk 3
buffer tsn: 17 rdba: 0x03800003 (14/3)
scn: 0x0000.0040273f seq: 0x01 flg: 0x04 tail: 0x273f1e01
frmt: 0x02 chkval: 0x4cd5 type: 0x1e=KTFB Bitmapped File Space Bitmap
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x06AD7600 to 0x06AD9600
6AD7600 0000A21E 03800003 0040273F 04010000 [........?'@.....]
6AD7610 00004CD5 0000000E 00000009 00000000 [.L..............]
6AD7620 00000008 0000F7F8 00000000 00000000 [................]
6AD7630 00000000 00000000 000000FF 00000000 [................]
6AD7640 00000000 00000000 00000000 00000000 [................]
Repeat 506 times
6AD95F0 00000000 00000000 00000000 273F1E01 [..............?']
File Space Bitmap Block:
BitMap Control:
RelFno: 14, BeginBlock: 9, Flag: 0, First: 8, Free: 63480
FF00000000000000 0000000000000000 0000000000000000 0000000000000000
0000000000000000 0000000000000000 0000000000000000 0000000000000000
......
可以看到FF00的二进制的表示方式为1111111100000000
表示有8个64kb的extent正在被占用,和我们视图查询的结果一样.
根据上面区的分配原则如果创建了一个大于1M而小于64M的段,那么每个extent的分配大小应该是1M
SQL> create table t
2 (id int)
3 storage
4 (initial 5M)
5 tablespace mytest;
表已创建。
SQL> col segment_name for a1;
SQL> select segment_name,extent_id,block_id,bytes,blocks from dba_extents
where wner='SYS' and segment_name='T';
S EXTENT_ID BLOCK_ID BYTES BLOCKS
- ---------- ---------- ---------- ----------
T 0 9 1048576 128
T 1 137 1048576 128
T 2 265 1048576 128
T 3 393 1048576 128
T 4 521 1048576 128
SQL> alter system dump datafile 14 block 3;
系统已更改。
......
Start dump data blocks tsn: 17 file#: 14 minblk 3 maxblk 3
buffer tsn: 17 rdba: 0x03800003 (14/3)
scn: 0x0000.004029d3 seq: 0x01 flg: 0x04 tail: 0x29d31e01
frmt: 0x02 chkval: 0xb3c5 type: 0x1e=KTFB Bitmapped File Space Bitmap
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x06AD7600 to 0x06AD9600
6AD7600 0000A21E 03800003 004029D3 04010000 [.........)@.....]
6AD7610 0000B3C5 0000000E 00000009 00000000 [................]
6AD7620 00000050 0000F7B0 00000000 00000000 [P...............]
6AD7630 00000000 00000000 FFFFFFFF FFFFFFFF [................]
6AD7640 0000FFFF 00000000 00000000 00000000 [................]
6AD7650 00000000 00000000 00000000 00000000 [................]
Repeat 505 times
6AD95F0 00000000 00000000 00000000 29D31E01 [...............)]
File Space Bitmap Block:
BitMap Control:
RelFno: 14, BeginBlock: 9, Flag: 0, First: 80, Free: 63408
FFFFFFFFFFFFFFFF FFFF000000000000 0000000000000000 0000000000000000
0000000000000000 0000000000000000 0000000000000000 0000000000000000
......
从转储文件中我们就可以得到结论了总共有 20 * 4 bits * 64KB=5120KB =5M 被使用了,共有5个FFFF,表示有5个64kb的extent被使用。
因此我们可以得出结论对于autoallocate的表空间,在位图管理上一个1bit就表示了64KB的磁盘空间。
导入论坛 引用链接 收藏 分享给好友 推荐到圈子 管理 举报
TAG:
我的栏目
标题搜索
日历
|
|||||||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
| 1 | 2 | 3 | 4 | 5 | |||||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 | |||
| 13 | 14 | 15 | 16 | 17 | 18 | 19 | |||
| 20 | 21 | 22 | 23 | 24 | 25 | 26 | |||
| 27 | 28 | 29 | 30 | 31 | |||||
数据统计
- 访问量: 18883
- 日志数: 284
- 书签数: 6
- 建立时间: 2007-12-10
- 更新时间: 2008-07-16


