jackyrong

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
在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语句要区分开来.

       

posted on 2009-06-22 21:47  jackyrong的世界  阅读(3123)  评论(0编辑  收藏  举报