我创建了一个名为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
答案 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函数并行运行。我之前没有在并行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,以便找出导致序列计划的原因。