expdp = exp + direct mode + parallel ?

tolywang發表於2010-06-24
以下是Anysql 的一篇文章, 比較了多種資料操作方式的速度, 其中提到expdp = exp + direct mode + parallel , expdp 預設方式下就是採用 直接路徑匯出的, 不過parallel 似乎必須設定才會生效吧 ?  也就是說必須設定parallel >0 才能使用到並行的 。  那麼使用expdp 和 exp direct=y 應該速度相當, 不過很多實驗還是證明 expdp速度要快於exp direct=y  , 難道還有其他區別 ?   他們的direct 又有區別 ?   



還有一個問題 :    exp  direct=y 是 " 直接從磁碟讀取資料到匯出session 的UGA中, 跳過了SQL命令處理層,避免了不必要的資料轉化 " ,  這裡的不必要的資料轉化是不是就是 SQL Select 語句從datafile讀取到buffer cache 中 ?  還是還有其他步驟被避免了 ?    從磁碟讀取的block匯出到匯出session 的UGA  的時候, 應該還需要SQL表示式將block中的資料行讀出返回給使用者 ?   





---------------------------------------------------------------------------------------------------------------------------
exp  direct=y  
直接匯出模式,資料直接從磁碟中讀取到匯出session的UGA中,跳過了SQL命令處理層。避免了不必要的資料轉換, 然後將紀錄返回給匯出客戶端,然後寫到dump檔案   跳過了SQL命令處理層表示DIRECT匯出不支援QUERY選項。

而傳統預設下的exp  
傳統匯出模式使用SQL SELECT語句抽取表資料。將資料從磁碟中讀入到buffer cache緩衝區中,並應用SQL表示式,將紀錄返回給匯出客戶端,然後寫到dump檔案。
---------------------------------------------------------------------------------------------------------------------------





  
昨天測試了一下expdp, exp和sqluldr2的效能, 測試機器為Linux, 機器主頻為3G, 測試時基本上sqluldr2的單個程式佔用了一整個CPU, 也就是CPU的主頻限制了sqluldr2和exp的速度. 以sqluldr2為參照物, 各個工具的速度對比結果如下.
expdp = (parallel degree – 1) * 2 * sqluldr2
exp direct  = 2 * sqluldr2
89exp = 1 * sqluldr2
    這時發現, expdp其實是exp的升級版本, exp + direct mode + parallel, 因為要支援並行生成幾個檔案, 所以Oracle透過控制後觀的並行程式來實現, 如果檔案是生成在客戶端, 則沒有辦法控制後臺程式來並行生成檔案, 這個是expdp的檔案只能生成在伺服器端的技術原因, 並且需要Oracle內部的目錄物件來控制檔案存放位置. 另外一個原因據說是因為安全, 匯出檔案並不表示得到了資料.
    Direct模式匯出可以得到一倍的效能提升, 但查遍了google和metalink, 都沒有找到direct unload有關的OCI API函式, 只找到一堆direct load有關的OCI API. 不知道有誰對這個有所瞭解? 難道是Oracle故意不開放這部份API, 以提升將資料遷移到其他型別資料庫的成本?
    有點想搞清楚exp和expdp中的direct模式是如何程式設計的, 用以改進一下sqluldr2.

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

相關文章