熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle中應用Export的一個問題

2013-11-13 15:32:25  來源: Oracle 

  系統環境
  硬件
  方正圓明服務器
  M的內存
  硬盤有二個分區CD光驅為E
  
  軟件
  操作系統WINDOWS SERVER
  數據庫ORACLE for NT
  
  數據庫
  創建數據庫後手工創建了二個表空間在存儲管理器中查看其屬性如下
  TS_PAY M (initial size k next size k increase size %)
  TS_IDX M (initial size k next size k increase size %)
  操作
  運行創建數據表索引觸發器及其視圖的腳本後TS_PAY占用MTS_IDX占用M
  分三次錄入相應的數據其中建立在表空間TS_PAY的數據表的數據量為M 建立在表空間TS_IDX的數據表的數據量為M
  每次錄入數據後用Oracle的實用工具Export以用戶模式導出整個數據其他參數為默認值(導出的文件大小為M)其中在中途用Oracle的實用工具Import作過幾次數據導入
  現象
  在OEM的存儲管理中查看表空間的使用情況發現TS_PAY占用MTS_IDX占用M對幾個占用空間圈較大的表和索引作了查詢發現其數據的記錄數據為但其占用空間由初建時的M變為M
  錄入的記錄數只有十幾條而且每條記錄的占用空間也不大所以表空間的這種占用速度與表的數據量增長呈現出的比例是極度不正常的
  原因分析
  經過實際測試發現上述現象的產生是由於在導出時使用了參數COMPRESS = Y
  在實用工具Export中參數Compress的缺省值為Y參數Compress指定Export和Import如何管理表數據的初始區
  如果缺省的COMPRESS = Y則Export對表數據加標記以便在導入時合並到某個初始區也就是說參數COMPRESS = Y告訴ORACLE合計一個表中所有已分配的空間並且為了反映當前總的已分配空間在導出轉儲文件中修改了表創建語句的初始值初始區值是導出執行前表中所有已分配空間的總和
  我們假設某個表有 個分區你想壓縮它五個分區中的每一個都分配了(PCTINCREASE=)在每個分區中只有個字節是有數據的並且在最後一個區中沒有已用的字節即空閒字節當使用參數COMPRESS=Y時ORACLE簡單地累加了所有已分配的空間然後分配字節作為導出轉儲文件中CREATE TABLE語句的初始區值這樣當你執行操作後ORACLE將把數據放在表區最初的大約字節中將近個字節的空間是空閒的
  如果指定COMPRESS = NExport將使用當前存儲參數包括初始區和下一個區的大小值參數值可能是在CREATE TABLE或ALTER TABLE語句中指定的值也可能是數據庫系修改過的值例如如果表增大而且如果PCTINCREASE參數不為零NEXT區的大小值就可能被修改
  雖然實際的合並是在導入時執行的但是只能在導出時而不能在導入時指定COMPRESS參數是Export實用程序而不是Import實用程序生成數據定義包括存儲參數定義這樣如果在導出時指定COMPRESS = Y就只能以合並形式導入數據COMPRESS參數不壓縮LOB數據對於LOB數據使用初始區大小和下一區大小的原始值
  解決辦法
  沒有進行過導出導入操作或沒有做過導入參數為COMPRESS=Y的數據
  這時只需在導出數據時選擇參數COMPRESS的值為N就不會出現上述現象
  如果數據已經以COMPRESS = Y方式導出而且又被Import實用工具導入或數據庫中的數據損壞只有用導出的數據導入
  這種情況的處理較為復雜一點可以分為以下幾個步驟來做
  ()對於幾個占用空間較大的數據表分別創建中間臨時表例如對於表SBYY我們可以進行如下操作
  CREATE TABLE T_TMP AS SELECT * FROM SBYY
  ()刪除數據庫中的表SBYY
  DROP TABLE SBYY
  ()在數據庫中按原結構重建表SBYY
  CREATE TABLE SBYY(
  JLDW_DMchar()NOT NULL
  JLDW_MCvarchar() NOT NULL
  JLDW_JCvarchar() NOT NULL
  XYBZ char()NOT NULL
  CONSTRAINT PK_SB_DM_JLDW_CKHW PRIMARY KEY (JLDW_DM)
  );
  ()將臨時表T_TMP中的數據插入到重建的表SBYY中
  INSERT INTO SBYY SELECT * FROM T_TMP
  ()刪除臨時表T_TMP
  DROP TABLE T_TMP;
  對於其它數據量不大但占空間較大的表或索引依次進行如上五個步驟的處理即可
  注意這種方法對於表間關系不復雜的數據清理比較簡便而有用對於關聯較復雜的表及其索引等要進行仔細分析表間關系才可動手

From:http://tw.wingwit.com/Article/program/Oracle/201311/16881.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.