这个实验得到的结论是:在系统默认情况下,我们创建表分配空间为64K,当数据量达到64K,系统将再次申请64K,而且
表的扩张
在还没有commit的情况下就已经发生,rollback后系统不会归还空间。
创建一张每行1K的新表,并插入一条数据;
SQL> create table testsegm (c1 char(1024));
Table created.
SQL> insert into testsegm values ('a');
1 row created.
利用系统表user_segments可以查询空间分配情况,默认系统分配8个BLOCK,每个BLOCK8K,新表默认分配空间大小为8*8K=64K
SQL> select tablespace_name,bytes,blocks,extents from user_segments where segment_name='TESTSEGM';
TABLESPACE_NAME BYTES BLOCKS EXTENTS
------------------------------ ---------- ---------- ----------
TS_XZH 65536 8 1
继续插入数据,当达到32行数据(每行1K,可以估算表32K),再查询表user_segments
SQL> insert into testsegm select c1 from testsegm;
1 row created.
SQL> /
2 rows created.
SQL> /
4 rows created.
SQL> /
8 rows created.
SQL> /
16 rows created.
SQL> select count(*) from testsegm;
COUNT(*)
----------
32
SQL> select tablespace_name,bytes,blocks,extents from user_segments where segment_name='TESTSEGM';
TABLESPACE_NAME BYTES BLOCKS EXTENTS
------------------------------ ---------- ---------- ----------
TS_XZH 65536 8 1
我们发现这时候还没有达到扩张的LIMITED
再插入32行数据,总记录数达到64行
SQL> insert into testsegm select c1 from testsegm;
32 rows created.
SQL> select count(*) from testsegm;
COUNT(*)
----------
64
再查询表user_segments,发现已经扩张到16个BLOCK,表占用空间为128K
SQL> select tablespace_name,bytes,blocks,extents from user_segments where segment_name='TESTSEGM';
TABLESPACE_NAME BYTES BLOCKS EXTENTS
------------------------------ ---------- ---------- ----------
TS_XZH 131072 16 2
这时候回滚
SQL> rollback
2 ;
Rollback complete.
SQL> select count(*) from testsegm;
COUNT(*)
----------
0
再查询表user_segments,这里看到没有变化,扩张的空间不会回收
SQL> select tablespace_name,bytes,blocks,extents from user_segments where segment_name='TESTSEGM';
TABLESPACE_NAME BYTES BLOCKS EXTENTS
------------------------------ ---------- ---------- ----------
TS_XZH 131072 16 2