利用 rowid 分片导出导入 lob 大表及数据泵最佳实践

前 言

有些时候为了缩短数据泵导入导出的时间,一般会选择将大表和其他表分开导出,尤其是遇到大表有 lob 字段的,导出时间会更慢。这样则需要分开导出大表和其他表,而单独导出大表也会很慢,可以利用 rowid 分片技术将大表分开来同时导出,提高导出效率。

1、大表信息

表记录只有 1525536 条,但是只有 1.8G 大小,有两个 CLOB 字段,查看 Lob 大小有 13.71G 大小。

Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.15.0.0.0 SQL> select count(*) from PROD.T_CA_TX_HIS; COUNT(*) ---------- 1525536 SQL> set line 120 SQL> col OWNER for a30 SQL> col SEGMENT_NAME for a30 SQL> select OWNER,SEGMENT_NAME,BYTES/1024/1024/1024 from dba_segments where SEGMENT_NAME='T_CA_TX_HIS' and OWNER='PROD'; OWNER SEGMENT_NAME BYTES/1024/1024/1024 ------------------------------ ------------------------------ -------------------- PROD T_CA_TX_HIS 1.83007813 SQL> desc PROD.T_CA_TX_HIS Name Null? Type ----------------------------------------------------------------- -------- -------------------------------------------- SEQUENCE_NO NOT NULL NUMBER(18) PK_TX_HIS NOT NULL VARCHAR2(36) FK_USER_CCBSCF VARCHAR2(36) FK_PERSON_CCBSCF VARCHAR2(36) SOFT_CA_BRAND NOT NULL VARCHAR2(20) SOFT_CA_USER_ID VARCHAR2(50) TARGET_URL VARCHAR2(300) TX_CODE VARCHAR2(20) TX_REQUEST CLOB TX_RESPONSE CLOB TX_ERROR_CODE VARCHAR2(50) TX_ERROR_MESSAGE VARCHAR2(500) CREATE_TIME NOT NULL DATE FK_USER_CREATE NOT NULL VARCHAR2(36) USER_NAME_CREATE NOT NULL VARCHAR2(60) SQL> col SEGMENT_NAME for a30 SQL> select segment_name,BYTES/1024/1024/1024 from dba_segments where OWNER='PROD' group by segment_name,BYTES/1024/1024/1024 order by 2 asc; .........省略........ SEGMENT_NAME BYTES/1024/1024/1024 ------------------------------ -------------------- T_OPEN_MESSAGE_SMS_RECORD 2.8125 SYS_LOB0000167075C00010$$ 13.7119141 --查看某用户下 Lob 字段大小 SET LINE 345 PAGES 456 COL OWNER FOR a20 COL TABLE_NAME FOR A40 COL SEGMENT_TYPE FOR A20 col COLUMN_NAME FOR A35 SELECT A.OWNER, B.TABLE_NAME, B.COLUMN_NAME, a.SEGMENT_TYPE, ROUND(SUM(A.BYTES/1024/1024/1024),2) G FROM DBA_SEGMENTS A LEFT JOIN DBA_LOBS B ON A.OWNER = B.OWNER AND A.SEGMENT_NAME = B.SEGMENT_NAME WHERE A.SEGMENT_TYPE='LOBSEGMENT' AND A.OWNER in('&OWNER') GROUP BY A.OWNER,B.TABLE_NAME,B.COLUMN_NAME,a.SEGMENT_TYPE ORDER BY 5 DESC; OWNER TABLE_NAME COLUMN_NAME SEGMENT_TYPE G -------------------- ---------------------------------------- ----------------------------------- -------------------- ---------- PROD T_CA_TX_HIS TX_RESPONSE LOBSEGMENT 13.71