当前位置: 首页 > news >正文

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自动分块,负载均衡千万级+
流式数据处理并行管道函数灵活处理复杂逻辑十万级+

 

 


文章转载自:
http://carpogonium.wkuuf.cn
http://atavist.wkuuf.cn
http://belowdecks.wkuuf.cn
http://agroboy.wkuuf.cn
http://alice.wkuuf.cn
http://bacchant.wkuuf.cn
http://brain.wkuuf.cn
http://acs.wkuuf.cn
http://antiketogenesis.wkuuf.cn
http://bromidic.wkuuf.cn
http://calicular.wkuuf.cn
http://agnation.wkuuf.cn
http://advisory.wkuuf.cn
http://armorica.wkuuf.cn
http://ceviche.wkuuf.cn
http://ceratin.wkuuf.cn
http://chanter.wkuuf.cn
http://apodia.wkuuf.cn
http://catoptromancy.wkuuf.cn
http://boulter.wkuuf.cn
http://bacco.wkuuf.cn
http://carlylese.wkuuf.cn
http://abuttal.wkuuf.cn
http://beetleheaded.wkuuf.cn
http://antiunion.wkuuf.cn
http://autoist.wkuuf.cn
http://chlorophyllite.wkuuf.cn
http://bison.wkuuf.cn
http://alcoholysis.wkuuf.cn
http://bricklaying.wkuuf.cn
http://www.dtcms.com/a/110146.html

相关文章:

  • XSLFO XSLT:深入解析两种强大的XML转换技术
  • leetcode0069. x 的平方根-easy
  • 从零构建大语言模型全栈开发指南:第五部分:行业应用与前沿探索-5.1.2行业落地挑战:算力成本与数据隐私解决方案
  • 操作系统(二):实时系统介绍与实例分析
  • PM2 在 Node.js 项目中的使用与部署指南
  • 【力扣hot100题】(047)路径总和Ⅲ
  • 如何在Android中使用匿名内部类?
  • 人工智能混合编程实践:C++调用封装好的DLL进行图像超分重建
  • MinIO 入门指南:高性能对象存储的安装与使用
  • 国内使用Claude 3.7 sonnet的6种方法及Cursor+Claude3.7实现从原型到app开发
  • 034-QSharedMemory
  • 人工智能在医疗领域的创新应用与挑战
  • HC32F460 - SPI+DMA+TFT
  • 蓝桥杯2024省赛PythonB组——日期问题
  • 【XTerminal】【树莓派】Linux系统下的函数调用编程
  • UE5 + Rider + VsCode 接入腾讯的 Puerts 脚本
  • XEOS 与 AutoMQ 推出联合方案,共筑云原生 Kafka 新生态
  • Pytorch深度学习框架60天进阶学习计划 - 第35天:模型解释性
  • C++学习笔记 | malloc calloc realloc的作用以及区别
  • AI大模型从0到1记录学习 day13
  • 【Docker 那些事儿】如何安全地停止、删除容器
  • Flutter vs React Native:跨平台移动开发框架对比
  • GPT-4o 图像生成:重新定义 AI 视觉创作边界
  • PHP基础二【变量/输出/数据类型/常量/字符串/运算符】
  • Day 3:Leetcode 比特位计数+只出现一次的数字 II
  • DDR(双倍数据率内存)在路由中扮演的角色
  • yolo格式批量修改类别
  • 【Linux篇】操作系统揭秘:进程创建、等待与终止的无缝衔接
  • 计算机控制系统:arduino呼吸灯
  • 【嵌入式学习4】特殊参数、文件IO