Oracle 数据库中,并行 DML

在 Oracle 数据库中,PL/SQL 的 BEGIN...END 块默认是串行执行的,但可以通过以下方法实现并行处理,提升大规模数据操作的性能:

并行 DML(Data Manipulation Language)

在 BEGIN...END 块中启用并行 DML(如 INSERTUPDATEDELETE),需显式配置会话参数和语法提示。

启用并行 DML

ALTER SESSION ENABLE PARALLEL DML; 

 使用并行提示

 BEGIN
  -- 并行插入(DOP=8)
  INSERT /*+ PARALLEL(t 8) */ INTO target_table t
  SELECT /*+ PARALLEL(s 8) */ * FROM source_table s;
  
  COMMIT;
END;
/

注意事项

  • 必须显式提交(COMMIT)才能释放并行资源。

  • 监控资源使用(CPU、I/O)避免过载。

 并行查询(Parallel Query)  

在 SELECT 语句中使用并行提示,加速数据检索(适用于复杂查询或大数据量)。 

DECLARE
  CURSOR c_emp IS
    SELECT /*+ PARALLEL(emp 8) */ employee_id, salary
    FROM employees emp
    WHERE department_id = 50;
BEGIN
  FOR rec IN c_emp LOOP
    -- 处理每条记录(例如写入日志)
    DBMS_OUTPUT.PUT_LINE(rec.employee_id || ': ' || rec.salary);
  END LOOP;
END;

 并行函数调用(Parallel Pipelined Functions)

 

CREATE OR REPLACE FUNCTION process_data_parallel
RETURN SYS_REFCURSOR
PARALLEL_ENABLE (PARTITION BY ANY)  -- 启用并行
IS
  v_cursor SYS_REFCURSOR;
BEGIN
  OPEN v_cursor FOR
    SELECT /*+ PARALLEL(emp 8) */ employee_id, salary * 1.1 AS new_salary
    FROM employees emp;
  RETURN v_cursor;
END;
/

-- 调用并行函数
DECLARE
  v_result SYS_REFCURSOR;
  v_id employees.employee_id%TYPE;
  v_salary employees.salary%TYPE;
BEGIN
  v_result := process_data_parallel;
  LOOP
    FETCH v_result INTO v_id, v_salary;
    EXIT WHEN v_result%NOTFOUND;
    -- 处理数据(例如插入新表)
    INSERT INTO salary_updates VALUES (v_id, v_salary);
  END LOOP;
  CLOSE v_result;
  COMMIT;
END;
/

 关键配置与注意事项

(1) 参数配置 

 parallel_max_servers:控制最大并行进程数。

 ALTER SYSTEM SET parallel_max_servers = 64;

parallel_degree_policy:设置并行策略(AUTOMANUALLIMITED)。 

 ALTER SESSION SET parallel_degree_policy = AUTO;

 

(2) 资源监控 

查看并行进程状态: 

SELECT sid, serial#, qcsid, server_group, server_set, degree
FROM v$px_session; 

 监控并行任务进度:

 SELECT * FROM v$session_longops WHERE opname LIKE '%PARALLEL%';

 (3) 事务与锁

 

  • 长事务风险:并行操作可能持有更多锁,需分批提交。

  • 死锁预防:避免跨并行任务的资源竞争。

 性能对比 

场景方法优势适用数据量
批量插入/更新并行 DML + APPEND直接路径写入,减少 Redo 日志百万级+
复杂查询处理并行查询提示加速数据检索十万级+
分块数据更新DBMS_PARALLEL_EXECUTE自动分块,负载均衡千万级+
流式数据处理并行管道函数灵活处理复杂逻辑十万级+

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愿与狸花过一生

盛时常作衰时想 上场当念下场时

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值