并行执行在Oracle中不起作用

时间:2018-03-14 19:05:07

标签: sql database oracle

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

/*+ parallel(8) */

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

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

有趣的是,当我检查时,有8个会话正在运行,这意味着它以并行方式运行。但是像这样运行的总时间与没有并行提示运行此查询相同。任何人都可以帮我修复它吗?我需要让加密并行运行才能获得更好的性能。

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

1 个答案:

答案 0 :(得分: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,但是下面的例子并没有显示出强制性的串行数据#34;操作

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,以便找出导致序列计划的原因。