如何提高datapump操作效能

eric0435發表於2016-04-11

當執行datapump匯出和匯入時都想盡一切辦法來提高效能,這裡介紹一些可以顯著提高DataPump效能的相關DataPump與資料庫引數
一.影響DataPump相關的DataPump引數
access_method
在某些情況下由Data Pump API所選擇的方法不能快速的訪問你的資料集。在這種情況下除了顯式地設定該引數來測試每一種訪問方法之外你是無法知道那種訪問方法更高效的。該引數有兩種選項direct_path與external_table

cluster=n
在RAC環境中可以顯著提供高Data Pump API基本操作的速度。注意這個引數只對Data Pump API操作起作用,在RAC環境中,建議將該引數設定為n。而如果將parallel_force_local設定為true所帶來的影響不僅僅只針對Data Pump API操作

data_options=disable_append_hint
它只是impdp引數,在非常特殊的情況下,可以安全的使用並且可能減少匯入資料的時間。只有滿足以下所有條件時才使用data_options=disable_append_hint引數。
1.匯入操作將向已經存在的表,分割槽或子分割槽匯入資料
2.將被匯入的已經存在的物件數非常少(比如是10或者更小)
3.當執行匯入操作時其它會話對於這些被匯入的物件只執行select語句。
data_options=disable_append_hint引數只有在11.2.0.1與更高版本中才可以使用。只有在要鎖定由其它會話所釋放物件花費很長時間的情況下使用data_option=disable_append_hint才能節省時間。

estimate
estimate引數有兩個相互排斥的選項,一個是blocks,另一個是statistics.在執行匯出操作時使用blocks方法來評估資料集大小比使用statistics方法消耗的時間更長。但是使用blocks方法評估的資料集大小要比使用statistics方法評估的資料集大小要精確些。如果匯出檔案的評估大小不是最主要關注的事,建議使用estimate=statistics。

exclude=comment
在某些情況下,終端使用者不需要列和物件型別對應的註釋,如果忽略這些資料,DataPump操作將會減少執行時間。

exclude=statistics
如果不需要使用排斥的include引數,那麼排除和匯出統計資訊將會縮短整個匯出操作的時間。dbms_stats.gather_database_stats過程將在資料匯入到目標資料庫後來生成統計資訊。DataPump操作當由DataPump引擎和任何其它的RDBMS會話並行執行對小表生成統計資訊時可能會hang且無限期。對於執行時間超過1小時或更長時間的DataPump操作,可以考慮禁用資料庫的自動統計資訊收集任務為了臨時禁用11g的自動統計資訊收集任務因此DataPump操作不會與該任務產生競爭,以sys使用者執行以下命令:
exec dbms_auto_task_admin.diable(client_name=>'auto optimizer stats collection',
operation=>null,window_name=>null);
在DataPump操作完成之後重新啟動統計資訊收集任務:
exec DBMS_AUTO_TASK_ADMIN.ENABLE(client_name => 'auto optimizer stats collection', operation => NULL, window_name => NULL);

為了臨時禁用10g的自動統計資訊收集任務因此DataPump操作不會與該任務產生競爭,以sys使用者執行以下命令:
exec sys.dbms_scheduler.disable ('GATHER_STATS_JOB');
在DataPump操作完成之後重新啟動統計資訊收集任務:
exec sys.dbms_scheduler.enable ('GATHER_STATS_JOB');

network_link
使用這個引數將會有效限制DataPump API的並行度,除非你的網路吞吐量和網路頻寬比本地裝置更好,使用network_link將會比使用匯出檔案慢很多。對於DataPump API效能來說,因為它傾向於比dump檔案操作要慢很多,只建議network_link作為最後一招來使用。可以考慮使用移動或共享裝置來儲存dump檔案來代替network_link來執行資料的遷移。

parallel
如果有多個CPU使用並且沒有使用CPU繫結或磁碟I/O繫結或記憶體繫結且在dumpfile引數中沒有使用多個dump檔案,那麼並行執行將會對效能產生正面影響。如果parallel引數設定為N,N>1,那麼為了更好的使用並行執行建議dumpfile引數應該設定為不比parallel引數小。

需要注意的是,parallel引數是DataPump API可以使用的併發Data Pump工作程式的上限,但DataPump API可能使用的DataPump工作程式數要比這個引數指定的少,依賴於主機環境中的瓶頸,parallel引數指定的值小於可用CPU個數時Data Pump API基本操作可能會更快。

query
使用query引數會顯著增加任何DataPump API基本操作的負載,這種開銷與被查詢表的資料量成正比。

remap_*
使用任何remap_*引數會顯著增加任何DataPump API基本操作的負載,這種開銷與被查詢表的資料量成正比。

二.影響DataPump操作效能的相關資料庫引數
aq_tm_processes=0
當這個引數被顯式設定為0,可能對高階佇列操作產生負面影響,進而對使用高階佇列的DataPump基本操作產生負面影響。可以復原這個引數或者設定一個大於0的值

deferred_segment_creation=true
只適用於匯入操作,這將會消除為空表分配空間所花費的時間。對於匯出操作設定這個引數將不會對效能產生顯著的影響。這個引數在11.2.0.2或更高版本中非常有用。

filesystemio_option=...
在特定情況下資料庫例項將會對ACFS檔案系統執行寫操作,指定Data Pump API執行的寫操作型別性質作為匯出操作的一部分,NONE以外的其它引數值都可能造成匯出操作變慢。

NLS_CHARACTERSET=... and NLS_NCHAR_CHARACTERSET=...
當源資料庫與目標資料庫之間這兩個引數存在差異時,在任何時候執行匯入操作時對於指定的分割槽表都不能使用多個DataPump工作程式來建立分割槽表和填充。在有些情況下,只有一個DataPump工作程式可以對錶資料執行操作,這將會對錶獲得排他鎖來阻止任何其它DataPump工作程式對相同的表執行操作。當分割槽表不存在排他鎖時可以使用多個DataPump工作程式同時操作來顯著提高對分割槽表匯入資料的效能。

NLS_COMP=... and NLS_SORT=...
在一些罕見的情況下,資料庫的這兩個引數被設定為了binary這將顯著提高DataPump API基本操作的速度。對於你的環境是否將這兩個引數設定為binary能提高效能需要進行測試。在會話登入後在會話級別設定這兩個引數可以透過以下的登入觸發器來實現。
CREATE OR REPLACE TRIGGER sys.expdp_nls_session_settings AFTER LOGON ON DATABASE
DECLARE
V_MODULE VARCHAR2(60);
BEGIN
SELECT SYS_CONTEXT ('USERENV', 'MODULE') INTO V_MODULE FROM DUAL;
IF UPPER(V_MODULE) LIKE 'UDE%'
THEN
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_COMP=''BINARY''';
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_SORT=''BINARY''';
END;
END IF;
END;
/

parallel_force_local=true
在RAC環境中可以顯著提高DataPump API基本操作的效能並且避免並行DML操作的bug。但這個引數只能對11.2.0.2或更高版本使用。

streams_pool_size
為了避免bug 17365043 'STREAMS AQ: ENQUEUE BLOCKED ON LOW MEMORY WHEN REDUCING STREAMS_POOL_SIZE'
建議將streams_pool_size設定以下查詢所返回的結果值
select 'ALTER SYSTEM SET STREAMS_POOL_SIZE='||(max(to_number(trim(c.ksppstvl)))+67108864)||' SCOPE=SPFILE;'
from sys.x$ksppi a, sys.x$ksppcv b, sys.x$ksppsv c
where a.indx = b.indx and a.indx = c.indx and lower(a.ksppinm) in ('__streams_pool_size','streams_pool_size');

_memory_broker_stat_interval=999
如果在你的緩慢DataPump環境中resize操作消耗了大量時間,那麼設定這個引數將會減少resize操作的頻率,進而在一個指定時間跨度內減少resize操作延遲其它操作的所花的時間。這是因為DataPump API依賴大量的流功能來幫助匯出和匯入操作。建議將這個引數設定為999,如果streams_pool_size引數已經被顯式設定並且頻繁的出現resize操作。

三.表DDL級別影響DataPump效能的相關引數
network_link+securefiles
network_link引數當移動包含有lob列的表,且lob是為了使用securefiles將會使移動操作非常緩慢,當使用network_link引數移動包含用了使用securefiles而有lob列的表時會生成大量undo資料。原因是分散式事務分配請求被限制為跨資料庫鏈路一次只有一個資料塊,這意味著大資料集傳輸將會產生更多的傳輸。

securefiles(不使用network_link)
使用securefiles儲存格式來儲存LOB列資料允許包含lob列的表使用並行執行匯出和匯入
使用basicfiles儲存格式來儲存LOB列資料不允許包含lob列的表使用並行執行匯出和匯入

四.表DML級別影響DataPump效能的相關引數
在DataPump操作和另一個訪問資料庫物件的會話之間產生競爭(通常是對錶,行資料的鎖)
DataPump引擎在執行匯出操作時將會等待由其它會話將其持有的行鎖與表鎖先釋放,再執行相關表的匯出和匯入。DataPump引擎在執行匯出操作時將會等待由其它會話所持有的行鎖與表鎖先釋放再執行匯出操作而典型匯出工具不會等待。因此匯出一張正在被頻繁更新的表要比匯出一個當前沒有被更新的表要慢

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

相關文章