天天看點

如何提高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');

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

EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_COMP=''BINARY''';

EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_SORT=''BINARY''';

END;

END IF;

/

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引擎在執行導出操作時将會等待由其它會話所持有的行鎖與表鎖先釋放再執行導出操作而典型導出工具不會等待。是以導出一張正在被頻繁更新的表要比導出一個目前沒有被更新的表要慢