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的大小,似乎看不出规律。
第一部分是在设置了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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29048127/viewspace-1101325/