如何提高datapump操作效能
當執行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引擎在執行匯出操作時將會等待由其它會話所持有的行鎖與表鎖先釋放再執行匯出操作而典型匯出工具不會等待。因此匯出一張正在被頻繁更新的表要比匯出一個當前沒有被更新的表要慢