oracle自动管理的extent的时候,一般一个表如果小于1M,则extent大小为8blocks,如果表的大小大于1M小于64M的时候extent将会变为128blocks 也就是1M。如果表的大小大于64M的时候,oracle分配的extent将会是1024blocks也就是8M;这个可以做个试验得到
SQL> create table t as select * from dba_objects;
表已创建。
SQL> select bytes,blocks from dba_extents where segment_name='T';
BYTES BLOCKS
---------- ----------
65536 8
65536 8
65536 8
65536 8
65536 8
65536 8
65536 8
65536 8
65536 8
65536 8
65536 8
BYTES BLOCKS
---------- ----------
65536 8
65536 8
65536 8
65536 8
65536 8
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
已选择21行。
前16个extent大小均为64K,证明小于1M时候都是按照8block进行分配的。
我们继续插入数据得到
SQL> insert into t select * from t;
已创建394344行。
SQL> select bytes,blocks from dba_extents where segment_name='T';
BYTES BLOCKS
---------- ----------
65536 8
65536 8
65536 8
65536 8
65536 8
65536 8
65536 8
65536 8
65536 8
65536 8
65536 8
BYTES BLOCKS
---------- ----------
65536 8
65536 8
65536 8
65536 8
65536 8
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
BYTES BLOCKS
---------- ----------
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
BYTES BLOCKS
---------- ----------
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
BYTES BLOCKS
---------- ----------
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
BYTES BLOCKS
---------- ----------
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
BYTES BLOCKS
---------- ----------
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
1048576 128
BYTES BLOCKS
---------- ----------
1048576 128
1048576 128
8388608 1024
8388608 1024
8388608 1024
已选择82行。
可以看到如果表大于64M的话,分配extent则是按照1024block,也就是8M进行分配的
这样的话如果一个表空间还有空间,但是没有8M连续空间的话,则不能进行分配空间给这样的表。
以上都是因为tablespace的属性allocate为system。我们可以指定uniform来让oracle根据我们的要求进行extent分配
SQL> create tablespace test1 datafile 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\TES
T01.dbf' size 10M uniform;
表空间已创建。
SQL> create table tt tablespace test1 as select * from dba_objects where 1<0;
表已创建。
---我们可以看到uniform的默认值也就是extent的大小为128blocks也就是1M;
SQL> select bytes,blocks from dba_extents where segment_name='TT' and wner='TE
T';
BYTES BLOCKS
---------- ----------
1048576 128
当然我们还可以指定uniform的大小。不过一旦这个指定了之后貌似不能修改
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22374393/viewspace-710304/ ,如需转载,请注明出处,否则将追究法律责任。