天天看點

傳統路徑導出 VS 直接路徑導出(oracle exp direct=y)

Oracle 傳統的Export與Import依舊被保留到11g,而且9i與10g有很多依舊使用Export與Import方式進行備份與恢複的企業。從Oracle 7.3開始,傳統的exp導出程式提供兩種的導出路徑方式,一個是傳統路徑導出(Conventional Path Export),一個是直接路徑導出(Direct Path Export)。本文即是因最近客戶的傳統導入導出性能問題對此進行描述。

1、兩者的差異

    a、 Conventional path Export

        傳統路徑模式使用SQL SELECT語句抽取表資料。資料從磁盤讀入到buffer cache緩沖區中,行被轉移到評估緩沖區。

        在此之後根據SQL表達式,将記錄傳回給導出用戶端,然後寫入到dump檔案。

    b、Direct path Export

       直接導出模式,資料直接從磁盤中讀取到導出session的PGA中,行被直接轉移到導出session的私有緩沖區,進而跳過SQL指令處理層。 

       避免了不必要的資料轉換。最後記錄傳回給導出用戶端,寫到dump檔案。

2、性能問題

    a、直接路徑導出方式比傳統路徑方式具有更優的性能,速度更快,因為繞過了SQL指令處理部分。

    b、直接路徑導出方式支援RECORDLENGTH參數(最大為64k),該參數值通常建議設定為系統I/O或者DB_BLOCK_SIZE的整數倍

    c、影響直接路徑導出的具體因素(DB_BLOCK_SIZE,列的類型,I/O性能,即資料檔案所在的磁盤驅動器是否單獨于dump檔案所在的磁盤驅動器)

    d、無論是直接路徑導出還是傳統路徑導出産生的dump,在使用imp方式導入時,會耗用相同的時間

3、簡單示例

    > exp system/manager FILE=exp_full.dmp LOG=exp_full.log \

    FULL=y DIRECT=y RECORDLENGTH=65535

    > imp system/manager FILE=exp_full.dmp LOG=imp_full.log \

    FULL=y RECORDLENGTH=65535 

4、直接路徑導出的限制

    a、直接路徑導出不支援互動模式

    b、不支援表空間傳輸模式(即TRANSPORT_TABLESPACES=Y不被支援),支援的是FULL,OWNER,TABLES導出方式

    c、不支援QUERY查詢方式,如exp scott/tiger TABLES=emp QUERY=\"WHERE job=\'SALESMAN\' \" 不被支援

    d、直接路徑導出使用RECORDLENGTH設定一次可以導出資料的量,取代傳統路徑使用buffer的設定

    e、直接路徑導出要求NLS_LANG環境參數等于資料庫字元集,負責收到EXP-41警告及EXP-0終止錯誤

5、示範兩種方式性能差異

[python] view plain copy

  1. a、傳統路徑導出與直接路徑導出性能對比  
  2. #下面直接進行日志對比  
  3. robin@SZDB:/u02/database/SYBO2SZ/BNR/dump> more dump1.log   
  4. Start to dump at Fri Jun 21 15:32:57 CST 2013 ....  
  5. Connected to: Oracle Database 10g Release 10.2.0.3.0 - 64bit Production  
  6. Export done in US7ASCII character set and UTF8 NCHAR character set  
  7. server uses UTF8 character set (possible charset conversion)  
  8. About to export specified tables via Conventional Path ...#這個地方是關鍵描述資訊,指明了導出方式  
  9. . . exporting table           TRADE_CLIENT_TBL_ARC    1395093 rows exported #資料139萬行  
  10. Export terminated successfully with warnings.  
  11. End dump at Fri Jun 21 15:34:31 CST 2013 .    #耗用時間15:34:31-15:32:57=不到2min  
  12. # Author : Robinson  
  13. # Blog   : http://blog.csdn.net/robinson_0612  
  14. robin@SZDB:/u02/database/SYBO2SZ/BNR/dump> more dump2.log   
  15. Start to dump at Fri Jun 21 15:37:13 CST 2013 ....  
  16. About to export specified tables via Direct Path ...#這個地方是關鍵描述資訊,指明了導出方式  
  17. . . exporting table           TRADE_CLIENT_TBL_ARC    1395093 rows exported  
  18. End dump at Fri Jun 21 15:37:30 CST 2013 .   #耗用時間15:37:30-15:37:13 =17s  
  19. b、示範對lob資料類型的支援  
  20. scott@SYBO2SZ> create table scott.testtab2 (nr number, txt clob);  
  21. Table created.  
  22. scott@SYBO2SZ> declare  
  23.   2  x varchar2(50);  
  24.   3  begin  
  25.   4  for i in 1..5000 loop  
  26.   5  x := 'This is a line with the number: ' || i;  
  27.   6  insert into scott.testtab2 values(i,x);  
  28.   7  commit;  
  29.   8    end loop;  
  30.   9  end;  
  31.  10  /  
  32. PL/SQL procedure successfully completed.  
  33. scott@SYBO2SZ> select count(*) from testtab2;  
  34.   COUNT(*)  
  35. ----------  
  36.       5000  
  37. robin@SZDB:/u02/database/SYBO2SZ/BNR/dump> exp scott/tiger file=exp_testtab2.dmp tables=scott.testtab2 direct=y  
  38. Export: Release 10.2.0.3.0 - Production on Fri Jun 21 11:56:37 2013  
  39. Copyright (c) 1982, 2005, Oracle.  All rights reserved.  
  40. About to export specified tables via Direct Path ...  
  41. Table TESTTAB2 will be exported in conventional path.  
  42. . . exporting table                       TESTTAB2       5000 rows exported  
  43. Export terminated successfully without warnings.