【實驗】兩種方法刪除表中的列與空間儲存釋放

secooler發表於2009-03-10
1.構造一個包含114688行記錄的實驗用大表test_tab1
sec@ora10g> conn sec/sec
Connected.
sec@ora10g> create table test_tab1 as select * from emp;

Table created.

sec@ora10g> insert into test_tab1 select * from test_tab1;

14 rows created.

sec@ora10g> /
sec@ora10g> /
sec@ora10g> /
sec@ora10g> /
sec@ora10g> /
sec@ora10g> /
sec@ora10g> /
sec@ora10g> /
sec@ora10g> /
sec@ora10g> /
sec@ora10g> /
sec@ora10g> /

57344 rows created.

sec@ora10g> commit;

Commit complete.

sec@ora10g> select count(*) from test_tab1;

  COUNT(*)
----------
    114688

2.查詢測試表的空間分配情況
sec@ora10g> select extent_id,file_id,block_id,blocks  from dba_extents where segment_name='TEST_TAB1' and wner='SEC';

 EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
---------- ---------- ---------- ----------
         0          5        177          8
         1          5        185          8
         2          5        193          8
         3          5        201          8
         4          5        209          8
         5          5        217          8
         6          5        225          8
         7          5        233          8
         8          5        241          8
         9          5        249          8
        10          5        257          8
        11          5        265          8
        12          5        273          8
        13          5        281          8
        14          5        289          8
        15          5        297          8
        16          5        393        128
        17          5        521        128
        18          5        649        128
        19          5        777        128
        20          5        905        128

21 rows selected.

3.刪除hiredate列,move表,驗證空間使用情況--結果:空間得到釋放
sec@ora10g> alter table test_tab1 drop column hiredate;

Table altered.

sec@ora10g> alter table test_tab1 move tablespace sec_d;

Table altered.

sec@ora10g> select extent_id,file_id,block_id,blocks  from dba_extents where segment_name='TEST_TAB1' and wner='SEC';

 EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
---------- ---------- ---------- ----------
         0          5        305          8
         1          5        313          8
         2          5        321          8
         3          5        329          8
         4          5        337          8
         5          5        345          8
         6          5        353          8
         7          5        361          8
         8          5        369          8
         9          5        377          8
        10          5        385          8
        11          5       1033          8
        12          5       1041          8
        13          5       1049          8
        14          5       1057          8
        15          5       1065          8
        16          5       1161        128
        17          5       1289        128
        18          5       1417        128
        19          5       1545        128

20 rows selected.

4.禁用多列,move表,驗證空間使用情況--結果:空間得到釋放
alter table test_tab1 set unused column comm;
alter table test_tab1 set unused column sal;
alter table test_tab1 set unused column mgr;

sec@ora10g> alter table test_tab1 move tablespace sec_d;

Table altered.

sec@ora10g> select extent_id,file_id,block_id,blocks  from dba_extents where segment_name='TEST_TAB1' and wner='SEC';

 EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
---------- ---------- ---------- ----------
         0          5        177          8
         1          5        185          8
         2          5        193          8
         3          5        201          8
         4          5        209          8
         5          5        217          8
         6          5        225          8
         7          5        233          8
         8          5        241          8
         9          5        249          8
        10          5        257          8
        11          5        265          8
        12          5        273          8
        13          5        281          8
        14          5        289          8
        15          5        297          8
        16          5        393        128
        17          5        521        128
        18          5        649        128

19 rows selected.


5.將所置unused列drop掉,move表,驗證空間使用情況--結果:空間使用情況更沒有變化
sec@ora10g> alter table test_tab1 drop unused columns;

Table altered.

sec@ora10g> alter table test_tab1 move tablespace sec_d;

Table altered.

sec@ora10g> select extent_id,file_id,block_id,blocks  from dba_extents where segment_name='TEST_TAB1' and wner='SEC';

 EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
---------- ---------- ---------- ----------
         0          5        305          8
         1          5        313          8
         2          5        321          8
         3          5        329          8
         4          5        337          8
         5          5        345          8
         6          5        353          8
         7          5        361          8
         8          5        369          8
         9          5        377          8
        10          5        385          8
        11          5        777          8
        12          5        785          8
        13          5        793          8
        14          5        801          8
        15          5        809          8
        16          5        905        128
        17          5       1033        128
        18          5       1161        128

19 rows selected.

6.小結
這個實驗列出了兩種drop列的方法,以及在move表後表的儲存空間的變化情況。

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-566641/,如需轉載,請註明出處,否則將追究法律責任。

相關文章