EXP在匯出11G的庫的時候,與過去10G,9I的版本有很大的差別. 就是沒有資料的表是不會分配空間的.
從Oracle 11.2.0.1版本開始,Oracle又提供了一種新的空間分配方法: Create一個非分區表時,這個Table Segment並沒有立刻建立, 而是直到有第一行記錄插入的時候才去建立這個Segment,這和我們以前的Segment的建立和空間分配方法是不一樣.這樣的段也被稱為延遲段.
(1)降低空間的開銷:當一次建立成百上千個表時,因為很多表短時間內根本不會用到,所以可以節約大量的磁碟開銷
(2)加快應用的部署:因為沒有分配Segment,所以建表的時候僅僅是操作資料字典而已,不設計空間的分配,所以效率自然就高了很多
2、設定deferred_segment_creation 參數
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation boolean TRUE
SQL> alter system set deferred_segment_creation=false;
系統已更改。
SQL> show parameter deferred_segment_creation
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation boolean FALSE
該參數值預設是TRUE,當改為FALSE時,無論是空表還是非空表,都分配segment。需注意的是:該值設定後對以前置入的空表不產生作用,仍不能匯出,只能對後面新增的表產生作用
當啟用deferred segment 之後,如果有空表,在使用exp進行匯出時, 會報:EXP-00011: 'Table Name' does not exist。即空表不被匯出。
如果想在建立表時就分配segment,可以使用如下SQL: createtable b_tab (id number, text varchar2(10)) segment creation immediate;
空表: user_talbes的rows=0 ,分配的段是user_segments
select'altertable '||table_name ||'allocate extent size 64K;' from user_tables where table_name not in (select segment_name from user_segments where segment_type ='TABLE')