Oracle表空间中有多个数据文件时,extent分配实验.

Oracle表空间中有多个数据文件时,extent分配实验. 实验分为两部分,
第一部分是在设置了uniform size的表空间上做实验,查看extent的分配规律。
第二部分是使用系统分配(Oracle自动分配)的方式做实验,查看extent的分配规律。

1. 表空间使用uniform大小,extent分配实验。
a. 创建统一分区表空间。
SQL> create tablespace tb_test01 datafile '/u01/app/oracle/oradata/wilson/tb_test01_01.dbf' size 100M uniform size 1m;
Tablespace created.

b. 再添加一个数据文件。
SQL> alter tablespace tb_test01 add datafile '/u01/app/oracle/oradata/wilson/tb_test01_02.dbf' size 100M;
Tablespace altered.

c. 创建表,并批量插入数据。
SQL> create table t_test1(id int,name varchar2(30)) tablespace tb_test01;
Table created.

SQL> insert into t_test1 select rownum,rpad('abcdef', 30, '-') from dba_objects;
75553 rows created.

SQL> /
75553 rows created.

SQL> commit;
Commit complete.

d. 查看表在表空间中的空间分配。
SQL> set pagesize 0
SQL> set lines 150

确定表空间 tb_test01的数据文件ID。
SQL> select FILE_NAME,FILE_ID from dba_data_files;
/u01/app/oracle/oradata/wilson/users01.dbf              4
/u01/app/oracle/oradata/wilson/undotbs01.dbf              3
/u01/app/oracle/oradata/wilson/sysaux01.dbf              2
/u01/app/oracle/oradata/wilson/system01.dbf              1
/u01/app/oracle/oradata/wilson/example01.dbf              5
/u01/app/oracle/oradata/wilson/tb_test01_01.dbf          6
/u01/app/oracle/oradata/wilson/tb_test01_02.dbf          7
/u01/app/oracle/oradata/wilson/rmtest01.dbf              8
8 rows selected.

最终extent的分布情况
SQL> select FILE_ID,EXTENT_ID,BLOCK_ID,BLOCKS from dba_extents where SEGMENT_NAME='T_TEST1';
     6         0          128     128
     7         1          128     128
     ...
     7        39         2560     128
     6        40         2688     128
41 rows selected.

通过上面的测试可以发现,当我们对表空间设置了uniform参数,无论分配多少个extent,Oracle系统都是按照1M来分配。


2. 表空间使用系统自动调整方式,extent分配实验。
a. 创建表空间tb_test02,并添加额外的数据文件。
SQL> create tablespace tb_test02 datafile '/u01/app/oracle/oradata/wilson/tb_test02_01.dbf' size 100M;
Tablespace created.

SQL> alter tablespace tb_test02 add datafile '/u01/app/oracle/oradata/wilson/tb_test02_02.dbf' size 100M;
Tablespace altered.


b. 创建表 t_test2并批量插入数据。
SQL> create table t_test2(id int,name varchar2(30)) tablespace tb_test02;
Table created.

SQL> insert into t_test2 select rownum,rpad('abcdef', 30, '-') from dba_objects;
75308 rows created.

SQL> /
75308 rows created.

SQL> commit;
Commit complete.

c. 查看extent在数据文件上的分布情况。

确定表空间 tb_test01的数据文件ID。
SQL> select FILE_NAME,FILE_ID from dba_data_files;
/u01/app/oracle/oradata/wilson/users01.dbf              4
/u01/app/oracle/oradata/wilson/undotbs01.dbf              3
/u01/app/oracle/oradata/wilson/sysaux01.dbf              2
/u01/app/oracle/oradata/wilson/system01.dbf              1
/u01/app/oracle/oradata/wilson/example01.dbf              5
/u01/app/oracle/oradata/wilson/tb_test01_01.dbf          6
/u01/app/oracle/oradata/wilson/tb_test01_02.dbf          7
/u01/app/oracle/oradata/wilson/rmtest01.dbf              8
/u01/app/oracle/oradata/wilson/tb_test02_01.dbf          9
/u01/app/oracle/oradata/wilson/tb_test02_02.dbf         10
10 rows selected.

d. extent的分布情况
SQL> select FILE_ID,EXTENT_ID,BLOCK_ID,BLOCKS from dba_extents where SEGMENT_NAME='T_TEST2';
     9         0          128       8
     ....
     9        15          248       8
     10        16          128     128
     ....
     9        41         1792     128
42 rows selected.

通过上面的实验我们发现,前16个64K(8个block)的extent全部分配在数据文件tb_test02_01.dbf中,并没有做balance.
知道从第17个块开始,extent大小增长到1M(128个block),才开始在数据文件1/2中做balance。


继续插入数据去查看extent的分配情况。
SQL> insert into t_test2 select * from t_test2;
602464 rows created.

SQL> insert into t_test2 select * from t_test2;
1204928 rows created.

SQL> commit;
Commit complete.

SQL> select FILE_ID,EXTENT_ID,BLOCK_ID,BLOCKS from dba_extents where SEGMENT_NAME='T_TEST2';
     9         0          128       8
     ...
     9        15          248       8
     10        16          128     128
     ...
     10        78         4096     128
     9        79         4224       1024
     ...
     10        84         6272       1024
85 rows selected.

随着表的持续增大,extent的大小也逐渐增大到8M(1024个block). 从第79个extent开始,重新按照8M来做blance.
从1M-8M,共分配了62个1m的extent,不太确定是不是62个8M的之后会分配更大的extent.


为了继续测试,resize了datafile到1G,并且继续往表中批量插入数据。
SQL> alter database datafile '/u01/app/oracle/oradata/wilson/tb_test02_01.dbf' resize 1G;
Database altered.

SQL> alter database datafile '/u01/app/oracle/oradata/wilson/tb_test02_02.dbf' resize 1G;
Database altered.

SQL>  insert into t_test2 select * from t_test2;
2409856 rows created.

SQL>  insert into t_test2 select * from t_test2;
4819712 rows created.

SQL> commit;
Commit complete.

SQL> select FILE_ID,EXTENT_ID,BLOCK_ID,BLOCKS from dba_extents where SEGMENT_NAME='T_TEST2';
     9         0          128       8
     ... 前16个64K的extent并没有做balance.
     9        15          248       8
     10        16          128     128
     ... 从17-78的62个1M的extent开始做balance.
     10        78         4096     128
     9        79         4224       1024
     ... 从79-198的119个8M的extent仍然是做balance.
     10       198        64640       1024
     9       199        65664       8192
     10       200        65664       8192
     9       201        73856       8192
     10       202        73856       8192
     从199-202的4个64M的extent仍然是做balance.
     
随着数据的增加,extent分配的越多,extent的大小也持续增加,从64k -- 1M -- 8M -- 64M. 这个很好理解。
但是64k--&gt1M用了16个extent, 从1M--&gt8M用了62个etents,从8M--&gt64M用了119个extent。
这个有点搞不太明白,究竟分配多少个extent后,Oracle会增加extent的大小,似乎看不出规律。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29048127/viewspace-1101325/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29048127/viewspace-1101325/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值