【问题标题】:Parallel Execution does not work in Oracle并行执行在 Oracle 中不起作用
【发布时间】:2018-03-25 09:04:32
【问题描述】:

我创建了一个名为 enc_dec 的包,其中有一个名为 encrypt 的函数,用于加密数据库信息。为了更快地加密大表,我尝试使用并行提示:

/*+ parallel(8) */

但更改后,加密性能与以前相同。似乎并行提示不起作用。我这样使用的查询:

create table A as 
select /*+ parallel(8) */ enc_dec.encrypt(B) as B from C;

有趣的是,当我检查时,有 8 个会话正在运行,这意味着它是并行运行的。但是这样运行的总时间与在没有并行提示的情况下运行此查询相同。谁能帮我解决它?我需要让加密并行运行以获得更好的性能。

附上执行计划图片。 execution plan 1execution plan 2

【问题讨论】:

  • 您的执行计划是否显示“LOAD TABLE CONVENTIONAL”?如果是这样,CTAS 没有使用直接路径负载。您不是直接从一张表中提取数据并将其放在新的位置,而是在修改数据的过程中,这可能会使直接路径变得不可能。
  • @Stilgar 我在执行计划中没有看到..
  • 您看到“加载为选择”了吗?如果是这样,Oracle 正在使用(或尝试使用)直接路径负载,它的速度几乎与它一样快。源表和目标表是否位于同一个 TABLESPACE 中?
  • @Stilgar 在选择后面添加 /*+ parallel(8) */ 后,我在计划表中看不到“加载为选择”。我不知道什么是'reside in the same TABLESPACE'。我试图加密源表中的一些列并将它们复制到目标表中,其余部分保持不变。
  • 我明白了。 CTAS 是一种将数据从一个表高速复制到新表的好方法。它只是因为直接路径加载而很快,并且只有在您不触摸它正在使用的行结果集(您正在使用加密)时才有效。在您的查询中,PARALLEL 仅可能会帮助您更快地从源表中获取数据。您可能需要使用 DDL 语句创建目标表并分配一定程度的并行度。然后使用带有 APPEND 提示的 INSERT 代替 CTAS。请咨询您的 DBA。

标签: sql database oracle


【解决方案1】:

操作PX COORDINATOR FORCED SERIAL 表示该函数未使用PARALLEL_ENABLE 定义。将该子句添加到函数中应该会提高并行性。

常规函数对象

create table c(b number);

create or replace package enc_dec is
    function encrypt(p number) return number;
end;
/

create or replace package body enc_dec is
    function encrypt(p number) return number is
    begin
        return p;
    end;
end;
/

explain plan for
create table A as
select /*+ parallel(8) */ enc_dec.encrypt(B) as B from C;

select * from table(dbms_xplan.display);

常规函数的执行计划

Plan hash value: 1467482239

------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                            | Name     | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
------------------------------------------------------------------------------------------------------------------------------
|   0 | CREATE TABLE STATEMENT               |          |     1 |    13 |     3   (0)| 00:00:01 |        |      |            |
|   1 |  PX COORDINATOR FORCED SERIAL        |          |       |       |            |          |        |      |            |
|   2 |   PX SEND QC (RANDOM)                | :TQ10001 |     1 |    13 |     2   (0)| 00:00:01 |  Q1,01 | P->S | QC (RAND)  |
|   3 |    LOAD AS SELECT (HYBRID TSM/HWMB)  | A        |       |       |            |          |  Q1,01 | PCWP |            |
|   4 |     PX RECEIVE                       |          |     1 |    13 |     2   (0)| 00:00:01 |  Q1,01 | PCWP |            |
|   5 |      PX SEND ROUND-ROBIN             | :TQ10000 |     1 |    13 |     2   (0)| 00:00:01 |        | S->P | RND-ROBIN  |
|   6 |       OPTIMIZER STATISTICS GATHERING |          |     1 |    13 |     2   (0)| 00:00:01 |        |      |            |
|   7 |        TABLE ACCESS FULL             | C        |     1 |    13 |     2   (0)| 00:00:01 |        |      |            |
------------------------------------------------------------------------------------------------------------------------------

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)
   - Degree of Parallelism is 8 because of hint

并行函数对象

这段代码与上面的代码几乎相同。唯一的区别是包名称和包规范和正文中的PARALLEL_ENABLE 子句。

create or replace package enc_dec_p is
    function encrypt(p number) return number parallel_enable;
end;
/

create or replace package body enc_dec_p is
    function encrypt(p number) return number parallel_enable is
    begin
        return p;
    end;
end;
/

explain plan for
create table A as
select /*+ parallel(8) */ enc_dec_p.encrypt(B) as B from C;

select * from table(dbms_xplan.display);

并行函数的执行计划

请注意,操作PX COORDINATOR FORCED SERIAL 已更改为PX COORDINATOR

Plan hash value: 3485102650

----------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name     | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
----------------------------------------------------------------------------------------------------------------------------
|   0 | CREATE TABLE STATEMENT             |          |     1 |    13 |     2   (0)| 00:00:01 |        |      |            |
|   1 |  PX COORDINATOR                    |          |       |       |            |          |        |      |            |
|   2 |   PX SEND QC (RANDOM)              | :TQ10000 |     1 |    13 |     2   (0)| 00:00:01 |  Q1,00 | P->S | QC (RAND)  |
|   3 |    LOAD AS SELECT (HYBRID TSM/HWMB)| A        |       |       |            |          |  Q1,00 | PCWP |            |
|   4 |     OPTIMIZER STATISTICS GATHERING |          |     1 |    13 |     2   (0)| 00:00:01 |  Q1,00 | PCWP |            |
|   5 |      PX BLOCK ITERATOR             |          |     1 |    13 |     2   (0)| 00:00:01 |  Q1,00 | PCWC |            |
|   6 |       TABLE ACCESS FULL            | C        |     1 |    13 |     2   (0)| 00:00:01 |  Q1,00 | PCWP |            |
----------------------------------------------------------------------------------------------------------------------------

Note
-----
   - dynamic statistics used: dynamic sampling (level=2)
   - Degree of Parallelism is 8 because of hint

如果您仍然遇到并行性问题,我建议您在我的回答 here 中查看一长串并行因素。

Java 函数

似乎没有任何固有限制阻止 Java 函数并行运行。我之前没有在并行 SQL 中使用过 Java,但下面的示例没有显示“强制串行”操作。

create or replace and compile
java source named "JavaEncrypt"
as
public class JavaEncrypt
{
  public static String create()
  {
    return "asdf";
  }
}
/

create or replace package enc_dec is
    function encrypt return varchar2 as language java
    name 'JavaEncrypt.create() return java.lang.String';
end;
/

explain plan for
create table A as
select /*+ parallel(8) */ enc_dec.encrypt as B from C;

select * from table(dbms_xplan.display);

执行计划:

Plan hash value: 3485102650

--------------------------------------------------------------------------------------------------------------------
| Id  | Operation                          | Name     | Rows  | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib |
--------------------------------------------------------------------------------------------------------------------
|   0 | CREATE TABLE STATEMENT             |          |     1 |     2   (0)| 00:00:01 |        |      |            |
|   1 |  PX COORDINATOR                    |          |       |            |          |        |      |            |
|   2 |   PX SEND QC (RANDOM)              | :TQ10000 |     1 |     2   (0)| 00:00:01 |  Q1,00 | P->S | QC (RAND)  |
|   3 |    LOAD AS SELECT (HYBRID TSM/HWMB)| A        |       |            |          |  Q1,00 | PCWP |            |
|   4 |     OPTIMIZER STATISTICS GATHERING |          |     1 |     2   (0)| 00:00:01 |  Q1,00 | PCWP |            |
|   5 |      PX BLOCK ITERATOR             |          |     1 |     2   (0)| 00:00:01 |  Q1,00 | PCWC |            |
|   6 |       TABLE ACCESS FULL            | C        |     1 |     2   (0)| 00:00:01 |  Q1,00 | PCWP |            |
--------------------------------------------------------------------------------------------------------------------

Note
-----
   - Degree of Parallelism is 8 because of hint

您可能需要发布整个 DDL 以便我们找出导致串行计划的原因。

【讨论】:

  • 非常感谢先生。我试过你的方法,但没有奏效。也许原因是加密包是一个 java 存储过程?我将 java 文件加载到数据库中并使用它来加密。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多