操作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 以便我们找出导致串行计划的原因。