如果表空间存在多个数据文件,那么extent在扩展的时候是如何决定在那个extent文件分配空间的呢?
下面做一个试验来说明这个问题:
本实验以本地管理的表空间为例。
--建立系统管理的本地表空间
SQL> create tablespace tbs_system datafile 'E:ORACLEORADATAORACLE9Itbs_system01.dbf' size 2112k,'E:ORACLEORADATAORACLE9Itbs_system02.dbf' size 2112k,'E:ORACLEORADATAORACLE9Itbs_system03.dbf' size 2112k,'E:ORACLEORADATAORACLE9Itbs_system04.dbf' size 2112k;
Tablespace created
--建立统一尺寸的本地表空间
SQL> create tablespace tbs_uniform datafile 'E:ORACLEORADATAORACLE9Itbs_uniform01.dbf' size 2112k,'E:ORACLEORADATAORACLE9Itbs_uniform02.dbf' size 2112k,'E:ORACLEORADATAORACLE9Itbs_uniform03.dbf' size 2112k,'E:ORACLEORADATAORACLE9Itbs_uniform04.dbf' size 2112k uniform size 64k;
Tablespace created
--建立一个基于系统管理表空间的表
SQL> create table t_system tablespace tbs_system as select * from item where rownum<15000;
Table created
SQL> select extent_id,blocks ,file_id from dba_extents where segment_name='T_SYSTEM';
EXTENT_ID BLOCKS FILE_ID
---------- ---------- ----------
0 8 10
1 8 10
2 8 10
3 8 10
4 8 10
5 8 10
6 8 10
7 8 10
8 8 10
9 8 10
10 8 10
11 8 10
12 8 10
13 8 10
14 8 10
15 8 10
16 128 11
17 128 12
18 128 13
19 128 10
EXTENT_ID BLOCKS FILE_ID
---------- ---------- ----------
20 128 11
21 128 12
22 rows selected
--从查询结果可以看出,在前16个extent前(每个extent大小是64k),extent都在同一个数据文件中;从17个extent(1m)开始,extent在同一个表空间的数据文件中循环分配。
--建立基于统一尺寸本地表空间的表
SQL> create table t_uniform tablespace tbs_uniform as select * from item where rownum<15000;
Table created
SQL> select extent_id,blocks ,file_id from dba_extents where segment_name='T_UNIFORM';
EXTENT_ID BLOCKS FILE_ID
---------- ---------- ----------
0 8 14
1 8 15
2 8 16
3 8 17
4 8 14
5 8 15
6 8 16
7 8 17
8 8 14
9 8 15
10 8 16
11 8 17
12 8 14
13 8 15
14 8 16
15 8 17
16 8 14
17 8 15
18 8 16
19 8 17
EXTENT_ID BLOCKS FILE_ID
---------- ---------- ----------
20 8 14
21 8 15
22 8 16
23 8 17
24 8 14
25 8 15
26 8 16
27 8 17
28 8 14
29 8 15
30 8 16
31 8 17
32 8 14
33 8 15
34 8 16
35 8 17
36 8 14
37 8 15
38 8 16
39 8 17
40 8 14
--从以上查询结果可以看出,在统一尺寸的表空间下,extent从一开始就在同一表空间下的各个数据文件中循环扩展。
经过测试,在DMT下,oracle在数据文件中扩展extent时也是趋于循环的。
我们可以利用oracle的这一特性,不用分区、不用在操作系统级做条带化,只需要在建立表空间时多添加几个数据文件(各个数据文件位于不同的磁盘中),就可以实现简单的条带化。
总结:
如果一个表空间存在多个数据文件,且多个数据文件都有可用的空间,则
1、如果是系统管理的本地表空间,为了使所有小区在一起,以避免在需要文件中分配大量小区而导致在删除对象时而产生的碎片,oracle会把对象的前16个extent(64k)都分配在同一个数据文件中;从第17个extent开始才循环在同一个表空间的各个数据文件中扩展。
2、如果是统一尺寸的本地管理表空间,则不用担心碎片问题,extent从一开始就在多个数据文件中循环分配。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/231499/viewspace-63747/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/231499/viewspace-63747/