[Oracle 工程師手記]Expdp 導出時速度慢的解決思路


返回 Oracle 索引頁

客戶問到,當進行數據導出(expdp) 時速度慢,詢問解決的方法。

通過查詢,看到在長時間等待的session 中,DataPump 的子進程 DW00,它的  LAST_CALL_ET 很大(7小時以上)

set lines 200 pages 2000
col username for a10
col machine for a10
col SPID for a10
col program for a10
col event for a10
select /*+rule*/ s.sid,s.serial#,s.username,p.spid,s.machine,s.program,s.sql_id,s.prev_sql_id,s.event,s.last_call_et,s.blocking_session
   from v$session s,v$process p
   where s.status='ACTIVE'
         and wait_class#<>6
         and p.addr=s.paddr order by last_call_et desc;

      SID    SERIAL# USERNAME   SPID       MACHINE      PROGRAM             SQL_ID        PREV_SQL_ID   EVENT                      LAST_CALL_ET      BLOCKING_SESSION
---------- ---------- ---------- ---------- ----------   ----------         ------------- ------------- ----------                 ------------     ----------------
     2230      32101 SYS        18546702   TET_LTDB1  oracle@TET_LTDB1  fa2h41tsd6y3r adsr5kj4p2357    db file sequential          27058
                                                                (DW00)                                 read
                                                                                       
......

 

接下來,用上面查到的 sql_id,在 v$sql 中,可以看到該SQL語句在執行怎樣的操作:

 

set linesize 200 pages 1000
set long 9999999
set lines 1000 pages 1000
col sql_fulltext for a1500
select sql_fulltext from v$sql where sql_id='&sql_id';
Enter value for sql_id: fa2h41tsd6y3r
old   1: select sql_fulltext from v$sql where sql_id='&sql_id'
new   1: select sql_fulltext from v$sql where sql_id='fa2h41tsd6y3r'


SQL_FULLTEXT
--------------------
SELECT /*+all_rows*/ SYS_XMLGEN(VALUE(KU$), XMLFORMAT.createFormat2('INDEX_T', '7')), KU$.OBJ_NUM ,KU$.ANC_OBJ.NAME ,KU$.ANC_OBJ.OWNER_NAME ,
                     KU$.ANC_OBJ.TYPE_NAME ,KU$.SCHEMA_OBJ.NAME ,KU$.SCHEMA_OBJ.NAME ,'INDEX' ,KU$.PROPERTY ,KU$.SCHEMA_OBJ.OWNER_NAME ,KU$.TS_NAME ,
                     to_char(KU$.TYPE_NUM) ,decode(cardinality(KU$.COL_LIST),0,'1','0')

  FROM SYS.KU$_INDEX_VIEW KU$
  WHERE NOT KU$.FOR_PKOID=1 AND  NOT KU$.FOR_REFPAR=1 AND  NOT BITAND(KU$.BASE_OBJ.FLAGS,128)!=0
        AND  NOT BITAND(KU$.SCHEMA_OBJ.FLAGS,4)=4
       AND   KU$.BASE_OBJ_NUM IN (SELECT * FROM TABLE(DBMS_METADATA.FETCH_OBJNUMS(200001))) AND   KU$.BASE_OBJ.OWNER_NAME LIKE '%'
                                  AND   KU$.SCHEMA_OBJ.OWNER_NAME LIKE '%' AND   KU$.TYPE_NUM =2 ORDER BY KU$.SCHEMA_OBJ.OWNER_NUM, KU$.SCHEMA_OBJ.DATAOBJ_NUM
  ......

 
可以發現,它正在訪問數據庫字典表 SYS.KU$_INDEX_VIEW KU$。

可以考慮收集與有關數據庫字典表的統計情報:

connect / as sysdba
exec dbms_stats.gather_dictionary_stats;
exec dbms_stats.lock_table_stats (null,'X$KCCLH');
exec dbms_stats.gather_fixed_objects_stats;

 

這樣可以使得執行時獲得更合理的執行計划。   
 
又因 expdp 會使用 stream_pool,也可以考慮,增加其大小。

返回 Oracle 索引頁 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM