程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> oracle 11.2g導出數據時,空表如果沒有分配segment的話,是不會

oracle 11.2g導出數據時,空表如果沒有分配segment的話,是不會

編輯:Oracle數據庫基礎
 

需要先將空表找出來,執行如下語句,再exp就ok;
不過需要重新分析統計信息再執行下面語句就ok,因為(列NUM_ROWS),這個列行數並不是准確的行數;
執行:select 'analyze table '||table_name||' compute statistics;' from user_tables;
然後復制到sql窗口,執行語句;
再選擇num_rows=0的表,如下:
select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;然後復制這些語句到新的sql窗口,執行,再將表的內容選中復制到txt庫裡,或直接復制到sql編輯器裡,執行sql語句。
再exp導出來,就可以導出空表了;

 

還有另外一個野蠻方法:將全用戶表都分配一遍空間,以免漏掉表;再導出;
或者寫存儲過程將count記錄=0 的表選擇出來再執行分配空間:
DECLARE
v_table tabs.table_name%TYPE;
v_sql VARCHAR2(888);
v_q NUMBER;
v_alter VARCHAR2(1000);
CURSOR c1 IS
SELECT table_name tn FROM tabs;
TYPE c IS REF CURSOR;
c2 c;
BEGIN
DBMS_OUTPUT.PUT_LINE('以下為空數據表的表名:');
FOR r1 IN c1 LOOP
v_table := r1.tn;
v_sql := 'SELECT COUNT(*) q FROM ' || v_table;
OPEN c2 FOR v_sql;
LOOP
FETCH c2
INTO v_q;
EXIT WHEN c2%NOTFOUND;
IF v_q = 0 THEN
DBMS_OUTPUT.PUT_LINE(v_table);
v_alter := 'alter table ' || v_table || ' allocate extent';
DBMS_OUTPUT.PUT_LINE(v_alter);
--要給空表分配空間,解除下面注釋
--EXECUTE IMMEDIATE v_alter;
END IF;
END LOOP;
CLOSE c2;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error occurred');
END;


oracle 11g 新增了一個參數:deferred_segment_creation,含義是段延遲創建,默認是true。
如果這個參數設置為true,你新建了一個表T1,並且沒有向其中插入數據,那麼這個表不會立即分配extent,也就是不占數據空間,只有當你insert數據後才分配空間。這樣可以節省少量的空間。
可用此修改:alter system set deferred_segment_creation=false;
在命令窗口中,用此查看:SQL>show parameter deferred_segment_creation
重啟服務後,再新建的表就不存在此問題了。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved