oracle 手动分配extent_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-->1M用了16个extent, 从1M-->8M用了62个etents,从8M-->64M用了119个extent。

这个有点搞不太明白,究竟分配多少个extent后,Oracle会增加extent的大小,似乎看不出规律。

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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部