读书笔记:告别“老黄牛”:教你如何让数据库任务快上好几倍

我们的文章会在微信公众号IT民工的龙马人生博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。

本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。

告别“老黄牛”:教你如何让数据库任务快上好几倍

想象一下这个场景:你有一个每天夜里运行的报表生成任务(一个存储过程)。它就像一头勤恳但缓慢的“老黄牛”,一条一条地处理数据。代码的逻辑大概是这样的:

开始
  循环 (从数据表里一条一条地取数据)
     对每条数据进行复杂的计算和整理
     把结果保存到另一个表格里
  结束循环
结束

它的核心问题在哪?
哪怕你的数据库服务器有8个甚至16个强大的CPU核心,这个程序在运行时,也只用了其中一个核心,其他核心都在“围观”和休息。这导致任务运行时间极长,经常通宵都跑不完,严重影响了白天的业务。

你可能会想,Oracle不是有“并行查询”吗?很遗憾,在这里它帮不上忙。因为并行查询优化的是单条SQL语句的内部执行,而我们这个任务的瓶颈在于那个循环往复的处理逻辑本身

那么,如何把这头“老黄牛”改造成一支“协同作战的特种部队”呢?主要有两种高级战术。


战术一:并行管道函数——聘请“Oracle智能管家”

这种方法需要你对代码动个“小手术”,但好处是后续的并行工作完全交给Oracle自动管理,非常省心。

核心妙招:把你的程序变成一个“数据水龙头”

我们不再在程序内部一条条地插入数据,而是把它改造成一个“数据水龙头”(管道函数)。处理好的数据会像水流一样从水龙头(使用 PIPE ROW 输出)里持续不断地流出来。

工作流程:

  1. 定义水龙头的出口:先告诉Oracle,你这个“水龙头”流出来的“水”(数据)是什么样子的(定义对象类型)。
  2. 改造程序:把你的存储过程改成一个特殊的函数,并声明它为“可并行的水龙头”(PIPELINEDPARALLEL_ENABLED)。
  3. 一声令下,并行开动:最后,你只需要使用 INSERT ... SELECT ... FROM TABLE(你的函数) 这样的语句,Oracle就会自动化身“智能管家”,召集多个“工人”(并行会话),同时从你的“水龙头”里接水,并快速地倒入目标表。

效果:
任务完成后,你查看目标表,会发现数据是由多个不同的工人(会话)协同插入的。通过一个特殊的SESSION_ID字段,你能清晰地看到每个工人处理了多少数据。

✅ 优点:高度自动化,Oracle全权负责调度,非常智能。
❌ 缺点:需要对原有代码结构进行一些改造。


战术二:DIY并行(使用官方工具包)——自己当“项目总指挥”

如果你的程序逻辑非常复杂,不方便重构成“水龙头”,那么这个方法就是你的“瑞士军刀”。它让你用最小的代码改动,实现并行处理。

核心思想:化整为零,分而治之

把需要处理的大表,像切蛋糕一样,切成许多小块(例如,按物理地址ROWID或按ID范围)。然后,你同时启动多个“小工”,每人只负责处理其中一块。

工作流程:

  1. 微调原有程序:在你的程序里加一个过滤条件,让它只处理指定范围(比如ROWID从A到B)的数据。这个改动通常非常小。
  2. 切分蛋糕:使用Oracle提供的 DBMS_PARALLEL_EXECUTE 工具包,轻松地把你的大表切成无数个互不重叠的小块。
  3. 分派任务:使用同一个工具包,指定:
    • 任务名(对应你切好的蛋糕)
    • 要运行的命令(就是调用你刚才微调过的程序)
    • 要用多少个“小工”(例如,4个并行 worker)

效果:
Oracle会立刻启动4个小工,每个小工去“任务池”里认领一小块蛋糕去处理。处理完后,自动再去领下一块,直到所有蛋糕被吃完。你可以在系统视图里实时监控每个小块的完成情况。

✅ 优点

  • 代码改动极小,几乎只是加了个WHERE条件。
  • 利用了Oracle官方的成熟框架,稳定可靠。
  • 自带错误处理,失败的小块可以重新处理。

总结与选型建议

特性 并行管道函数 (智能管家) DIY并行工具包 (项目总指挥)
自动化程度 ,全自动托管 ,你定义规则,Oracle执行
代码改动 ,需要结构性改造 ,通常只加一个过滤条件
控制力 较粗,由Oracle决定 很细,可控制分块大小和工人数量
推荐场景 代码结构清晰,易于重构 快速改造现有复杂任务的首选

总而言之:

如果你的任务是那种运行几个小时甚至通宵的“老黄牛”式串行作业,那么这两种并行化技术就是你的性能倍增器。它们能让你服务器的多个CPU核心从“围观”变成“实干”,将任务运行时间成倍缩短。

  • 一劳永逸、高度自动化,且代码允许改造,选战术一(并行管道函数)
  • 快速上手、最小化改动现有复杂代码,战术二(DIY并行工具包) 是你的不二之选。

------------------作者介绍-----------------------
姓名:黄廷忠
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

posted @ 2025-11-12 16:58  认真就输  阅读(18)  评论(0)    收藏  举报