理解exp, imp 使用direct=y 及imp commit=y

tolywang發表於2009-08-28

exp  中direct 引數預設為N , 即採用普通路徑匯出,和使用程式匯出恢復資料一樣,和執行其他查詢一樣, 從磁碟和高速緩衝區讀取資料, 從那裡,資料被移到一個工作區,在工作區,行被提出來, 檢查和查詢中的where子句是否匹配,然後將資料送到匯出程式。

exp direct =y , 表示直接路徑匯出, 比普通路徑匯出速度快很多, 不能使用query子查詢, SQL查詢仍然被執行,儲存表的塊仍然被讀入資料庫的快取記憶體區,但是它們從快取記憶體區直接傳給exp匯出程式, 相對普通路徑,少了檢查行是否匹配的這個過程, 所以Query子句不能在direct=y 的情況下使用。 表包含Lob的時候也不能使用y 。

 

-------------------------------------------------------------------------------------------------------------------------------------

 

              oracle是9204,資料透過exp匯出,以前使用direct=n的方式匯出,考慮到效率問題,使用了direct=y引數,雖說效率得到大幅提高,但是再恢復資料庫是會提示imp-00051,imp-00008等的相關錯誤;經metalink查詢發現這是9204的bug,就是再exp時如果指定了direct=y可能導致exp的輸出檔案存在中斷的情況。解決辦法是,升級到9207或者使用direct=n.  這個問題提示我們不管用什麼方式進行備份,一定要定時將備份檔案進行恢復測試,及時發現問題,以防真正出現問題時候,備份無法使用的情況  

 

-----------------------------------------------------------------------------------------------------------------------------------------

 

           在匯入資料的時候,假如commit=Y,則由引數Buffer決定匯入過程中什麼時候做Commit操作。*(Note:"For tables containing LONG, LOB, BFILE, REF, ROWID, UROWID columns, array inserts are not done. If COMMIT=y, Import commits these tables after each row.")   匯入的時候,Oracle使用Array Insert.將record從dmp file中讀取到imp process buffer中,當buffer“滿”的時候,Bind Array,執行Insert.   看來Oracle也透過批次繫結來提高imp效能,以前還以為是read one record,insert one record,read one record,insert one record…… ******************************************************************************** INSERT /*+NESTED_TABLE_SET_REFS+*/ INTO "T_1K" ("X")VALUES (:1) call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- -------
Parse 1 0.00 0.01 0 4 0 0
Execute 102 0.02 0.04 0 11 174 6601
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- -------
total 103 0.02 0.05 0 15 174 6601 Misses in library cache during parse: 1 ********************************************************************************   表T_1K每個記錄在imp的時候佔用大概1k的buffer,如上是設定了buffer=64k imp的結果。  Array Bind (Commit)102次,匯入紀錄6601條  6601/102 =64.7156863 about 64 rows/insert, using a 64k buffer —— that makes sense   看不出Oracle內部使用array bind 的地方挺多的: arraysize in sqlplus, Forall bind / fetch in PL/SQL……

-

資料引用:

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

相關文章