在Oracle的逻辑存储中,表空间由各种类型的段组成,而段则由区组成,区是段分配存储的单位。当建立一个表段时,Oracle为该段分配初始区,如果之后由于数据的插入,初始区装满后,将继续分配下一个区,区的大小在表段或者更高一级的存储参数中指定,下面通过实验的方式把分配的过程展示出来。
1. 在scott方案下建立初始表段
SQL> conn scott/tiger
已连接。
SQL> create table t1
2 as
3 select * from dept where 1=3;
表已创建。
2. 查看段的初始区分配情况
SQL> select segment_name,extent_id,bytes from user_extents
2 where segment_name='T1';
SEGMENT_NAME EXTENT_ID BYTES
-------------------- ---------- ----------
T1 0 65536
可以看到段T1的初始区ID为0,大小为 65536 bytes;
3. 向表段中插入数据,使Oracle为该段分配更多的区
SQL> begin
2 insert into t1 select * from dept;
3 for i in 1..10 loop
4 insert into t1 select * from t1;
5 commit;
6 end loop;
7 end;
8 /
PL/SQL 过程已成功完成。
SQL> select segment_name,extent_id,bytes from user_extents
2 where segment_name='T1';
SEGMENT_NAME EXTENT_ID BYTES
-------------------- ---------- ----------
T1 0 65536
T1 1 65536
T1 2 65536
此时看到随着数据的插入,T1段动态扩展为三个区;
4. 回收T1段的区
SQL> delete t1;
已删除4096行。
SQL> select segment_name,extent_id,bytes from user_extents
2 where segment_name='T1';
SEGMENT_NAME EXTENT_ID BYTES
-------------------- ---------- ----------
T1 0 65536
T1 1 65536
T1 2 65536
此时表段的数据已经删除,但所有extent依然健在;
SQL> truncate table t1;
表被截断。
SQL> select segment_name,extent_id,bytes from user_extents
2 where segment_name='T1';
SEGMENT_NAME EXTENT_ID BYTES
-------------------- ---------- ----------
T1 0 65536
截断表后,表的空间也同时回收,这与delete语句要区分开来.