【发布时间】:2021-09-22 15:51:12
【问题描述】:
我将 DML 和 DDL 作为我的程序的一部分,并在 DML 和 DDL 上启用了并行。我想使用并行提示在并行模式下运行它们,但它们都不是并行执行的。这是使用动态 SQL 的限制吗?
例如
DECLARE
v_parallel_degree NUMBER := 8;
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION FORCE PARALLEL DML PARALLEL ' || v_parallel_degree;
EXECUTE IMMEDIATE 'ALTER SESSION FORCE PARALLEL QUERY PARALLEL ' || v_parallel_degree;
EXECUTE IMMEDIATE 'ALTER SESSION FORCE PARALLEL DDL PARALLEL ' || v_parallel_degree;
EXECUTE IMMEDIATE 'INSERT /*+PARALLEL(DEFAULT)*/ INTO '|| p_target_tabname || ' NOLOGGING
SELECT /*+PARALLEL(dmf,DEFAULT)*/*
FROM ' || p_source_tabname ||' PARTITION('|| p_part_name ||');
EXECUTE IMMEDIATE 'CREATE UNIQUE INDEX idx_pk ON TAB_HIST
(COL1,COL2,COL3)
LOCAL
NOLOGGING PARALLEL ' || v_parallel_degree;
END;
我什至尝试了下面的块但没有工作。
v_sql := 'BEGIN
EXECUTE IMMEDIATE ''ALTER SESSION FORCE PARALLEL DML PARALLEL ' || v_parallel_degree ||''';
EXECUTE IMMEDIATE ''ALTER SESSION FORCE PARALLEL QUERY PARALLEL ' || v_parallel_degree ||''';
INSERT /*+PARALLEL(DEFAULT)*/ INTO '|| p_target_tabname || ' NOLOGGING
SELECT /*+PARALLEL(dmf,DEFAULT)*/*
FROM ' || p_source_tabname ||' PARTITION('|| p_part_name ||') dmf;
DBMS_OUTPUT.PUT_LINE(''Inserted '' || SQL%ROWCOUNT || '' Rows into Table- '' || p_target_tabname || '' Partition - '' || p_part_name );
COMMIT;
END;';
EXECUTE IMMEDIATE v_sql;
Oracle Version -
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production
CORE 12.1.0.2.0 Production
很快将升级到 19c。
任何建议都表示赞赏..
TIA 文卡特
【问题讨论】:
-
您如何确定它们不是以并行模式运行的?
-
@astentx,我没有用任何查询验证这一点,但我发现执行时间与同一过程中的简单插入相比存在差异,在该过程中插入 14M 行只需 10 秒使用动态 SQL 2 分钟。还观察了我的会话浏览器中的会话数。我正在研究此处提供的其他答案。谢谢大家的回答,我们会尽快回复您。
标签: oracle dynamic-sql