我有一个大约50G的表,我想把它移到另一个环境中。我们选择的方法是
使用expdp从源IOT表导出数据创建不带辅助索引的临时IOT表将impdp与以下命令一起使用。我面临的问题是将数据上传到这个IOT表的速度很慢。我听说并行性在导入IOT时不起作用。有办法绕过这个吗?
impdp user/pwd@server tables=DATE_ATTRIBUTE_VALUES0 directory=dp_dir dumpfile= /ora_dump/DOUK5DAS/datapump/date_attrib_values_01.dmp,/ora_dump/DOUK5DAS/datapump/date_attrib_values_02.dmp, /ora_dump/DOUK5DAS/datapump/date_attrib_values_03.dmp,/ora_dump/DOUK5DAS/datapump/date_attrib_values_04.dmp,/ora_dump/DOUK5DAS/datapump/date_attrib_values_05.dmp logfile=date_attrib_values_imp.log REMAP_TABLE=server.DATE_ATTRIBUTE_VALUES0:T_DATE_ATTRIBUTE_VALUES0 TABLE_EXISTS_ACTION=APPEND DATA_OPTIONS=TRUST_EXISTING_TABLE_PARTITIONS ACCESS_METHOD=AUTOMATIC METRICS=y LOGTIME=all CLUSTER=N PARALLEL=4 &
必须使用分区来启用对索引组织表的并行插入。根据手册:;直接路径INSERT到索引组织表(IOT)的单个分区,到只有一个分区的分区IOT,或到未分区的IOT,将串行执行">
不幸的是,并行性可能无法完全启用还有其他几个原因。例如,您可能需要将表更改为NOLOGGING
、删除触发器、删除关系约束等。我建议您先尝试使用直通SQL来测量并行度,然后在成功后,再次尝试导出和导入。此外,当文件数量与并行度匹配时,impdp并行性效果最好,因此如果有5个文件,我建议尝试使用PARALLEL=5
而不是4。
以下是一个常规索引组织表的示例,该表在读取时使用一些并行性,但在写入时不使用并行性。注意";PX";操作仅发生在LOAD AS SELECT
之后,而不是之前。如果您使用的是Oracle的最新版本;注意";部分将完美地描述为什么并行DML并没有发生。
drop table date_attribute_values0;
create table date_attribute_values0
(
id number,
the_date date,
constraint pk_locations primary key (id)
)
organization index;
alter session enable parallel dml;
explain plan for
insert /*+ append parallel(5) */ into date_attribute_values0
select * from date_attribute_values0;
select * from table(dbms_xplan.display(format => 'basic +note'));
Plan hash value: 132732
-----------------------------------------------------------
| Id | Operation | Name |
-----------------------------------------------------------
| 0 | INSERT STATEMENT | |
| 1 | LOAD AS SELECT | DATE_ATTRIBUTE_VALUES0 |
| 2 | PX COORDINATOR | |
| 3 | PX SEND QC (RANDOM) | :TQ10000 |
| 4 | PX BLOCK ITERATOR | |
| 5 | INDEX FAST FULL SCAN| PK_LOCATIONS |
-----------------------------------------------------------
Note
-----
- dynamic statistics used: dynamic sampling (level=2)
- Degree of Parallelism is 5 because of hint
- PDML disabled because non partitioned or single fragment IOT used
以下示例显示了一个使用完全读写并行性的分区索引组织表。注意";PX";在CCD_ 5之前和之后的操作。
drop table date_attribute_values2;
create table date_attribute_values2
(
id number,
the_date date,
constraint pk_locations2 primary key (id)
)
organization index
partition by hash (id) partitions 5;
alter session enable parallel dml;
explain plan for
insert /*+ append parallel(5) */ into date_attribute_values2
select * from date_attribute_values2;
select * from table(dbms_xplan.display(format => 'basic +note'));
Plan hash value: 438294917
------------------------------------------------------------------------
| Id | Operation | Name |
------------------------------------------------------------------------
| 0 | INSERT STATEMENT | |
| 1 | PX COORDINATOR | |
| 2 | PX SEND QC (RANDOM) | :TQ10002 |
| 3 | INDEX MAINTENANCE | DATE_ATTRIBUTE_VALUES2 |
| 4 | PX RECEIVE | |
| 5 | PX SEND RANGE | :TQ10001 |
| 6 | LOAD AS SELECT (HIGH WATER MARK)| DATE_ATTRIBUTE_VALUES2 |
| 7 | PX RECEIVE | |
| 8 | PX SEND PARTITION (KEY) | :TQ10000 |
| 9 | PX PARTITION HASH ALL | |
| 10 | INDEX FULL SCAN | PK_LOCATIONS2 |
------------------------------------------------------------------------
Note
-----
- dynamic statistics used: dynamic sampling (level=2)
- Degree of Parallelism is 5 because of hint
在常规SQL中实现并行性之后,在导入过程中仍然需要仔细监视数据库。使用像Oracle Enterprise Manager这样的可视化工具来帮助您查看多个线程的分配和使用情况可能会有所帮助。