這個實驗得到的結論是:在系統默認情況下,我們創建表分配空間爲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