过着简单,真实的生活,喜欢收藏变形金刚(TFE,G1,SL系列),研究金融股市,KOF98,篮球,学习研究Oracle技术,我并不是一个全职的Oracle DBA,但是对于Oracle技术的热爱和研究,是一个不争的事实,愿意结交广大Oracle技术爱好者!MSN:oracle_kof_tf@hotmail.com

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:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar