暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 无法在简单的insert语句中使用DOP (并行度)

askTom 2017-08-23
416

问题描述

我是完全陌生的oracle和卡在一个应用程序特定的问题是使用oracle db。所以下面是关于我所面临的问题的查询:

我试图一个非常简单的查询 (插入到DIM select * 从标记) 与1800万记录在标记。
大约花了5个小时。
所以我在目标表上创建了DOP (平行度),下面是解释计划。
目标表有4个索引,其中一个constarint主键作为表定义本身的索引。(因此总共有5个索引)。<使用索引表空间 “INDEX_TEST” 启用约束 “ABC” 主键 (“键”)>
我还创建了所有的索引并行,除了使用索引在表DDL中的constaraint (试图改变它的平行)。

--------------------------------------------------------------------------------------------------------------------------
复制

| Id  | Operation                | Name             | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
复制

--------------------------------------------------------------------------------------------------------------------------
复制

|   0 | INSERT STATEMENT         |                  |    18M|  4838M| 46989   (1)| 00:00:02 |        |      |            |
复制

|   1 |  LOAD TABLE CONVENTIONAL | DIM             |       |       |            |          |        |      |            |
复制

|   2 |   SEQUENCE               | SEQ             |       |       |            |          |        |      |            |
复制

|   3 |    PX COORDINATOR        |                  |       |       |            |          |        |      |            |
复制

|   4 |     PX SEND QC (RANDOM)  | :TQ10000         |    18M|  4838M| 46989   (1)| 00:00:02 |  Q1,00 | P->S | QC (RAND)  |
复制

|   5 |      PX BLOCK ITERATOR   |                  |    18M|  4838M| 46989   (1)| 00:00:02 |  Q1,00 | PCWC |            |
复制

|*  6 |       TABLE ACCESS FULL  | FLAGGING       |    18M|  4838M| 46989   (1)| 00:00:02 |  Q1,00 | PCWP |            |
复制

--------------------------------------------------------------------------------------------------------------------------
复制


我在下面的注释中得到:

-使用的动态统计: 动态采样 (级别 = 自动)
-由于表属性,并行度为4
-禁用PDML,因为索引未并行就绪

你能帮助我们理解这一点吗?根据我的理解,加载时不使用并行性。
除了约束索引我创建了所有的索引parallel。也试图改变约束索引的并行仍然得到 “PDML禁用,因为索引不是并行准备”。
在这种情况下如何进行?


专家解答

好的,首先,插入1800万行需要5个小时通常是错误的,例如

SQL> create table t as
  2  select e.* from scott.emp e,
  3  ( select 1 from dual connect by level <= 20000000/14 );

Table created.

SQL> create table t1 as select * from scott.emp where 1=0;

SQL> set timing on
SQL> insert /*+ APPEND */ into t1
  2  select * from t;

19999994 rows created.

Elapsed: 00:00:11.83

复制


2000万行11秒,在我的笔记本电脑上。这将显示影响约束、索引、触发器等可能对您的负载有影响。所以理想情况下,如果你的要求允许,你想禁用这些东西,加载数据,然后重新启用。

当涉及到并行进行ins/upd/del修改时,您必须首先在会话级别启用它,即

alter会话启用并行dml;

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论