再上一篇:13.5审计和段空间压缩
上一篇:13.6小结
主页
下一篇:14.2并行查询
再下一篇:14.3并行DML
文章列表

14.1何时使用并行执行

Oracle 9i 10g编程艺术:深入数据库体系结构

并行执行可能很神奇。一个过程原本需要执行数小时或者数天,通过使用并行执行,可能几分钟内就 可以完成。将一个大问题分解为小部分,这在有些情况下可以显著地减少处理时间。不过,考虑并行执行 时,要记住一个基本概念,这可能很有用。下面这句话选自Jonathan Lewis所著的Practical Oracle8i: Building Efficient Databases(Addison-Wesley, 2001),尽管很简短,但它对这个概念做了很好的总结:
并行查询(PARALLEL QUERY)选项本质上是不可扩缩的。
并行执行本质上是一个不可扩缩的解决方案,设计为允许单个用户或每个特定 SQL语句占用数据库的 所有资源。如果某个特性允许一个人使用所有可用的资源,倘若再允许两个人使用这个特性,就会遇到明
显的竞争问题。随着系统上并发用户数的增加,要应付这些并发用户,系统上的资源(内存、CPU和I/O) 开始表现出有些勉为其难,此时能不能部署并行操作就有疑问了。例如,如果你有一台4CPU的主机,平均 有32个用户同时执行查询,那你很可能不希望并行执行他们的操作。如果允许每个用户执行一个“并行度 为2”的查询,这就会在一台仅有4个CPU的主机上发生64个并发操作。即使并行执行之前这台机器原本 不算疲于奔命,现在也很可能难逃此劫。
简单地说,并行执行也可能是一个很糟糕的想法。在许多情况下,应用并行处理后,可能只会带来资 源占用的增加,因为并行执行试图使用所有可用的资源。在一个系统(如一个OLTP系统)中,如果资源必 须由多个并发事务所共享,你就会观察到,并行执行可能导致响应时间增加。Oracle会避开某些在串行执 行计划中能高效使用的执行技术,而采用诸如全面扫描等执行路径,希望能把较大的批量操作划分为多个 部分,并且并行地完成这些部分,从而能优于串行计划。但是如果并行执行应用不当,不仅不能解决性能 问题,反而会成为性能问题的根源。
所以,在应用并行执行之前,需要保证以下两点成立: 必须有一个非常大的任务,如对50GB数据进行全面扫描。
必须有足够的可用资源。在并行全面扫描50GB数据之前,你要确保有足够的空闲CPU(以 容纳并行进程),还要有足够的I/O通道。50GB数据可能分布在多个物理磁盘上(而不只是一个 物理磁盘),以允许多个并发读请求能同时发生,从磁盘到计算机应当有足够多的I/O通道,以 便能并行地从磁盘获取数据,等等。
如果只有一个小任务(通常 OLTP系统中执行的查询就是这种典型的小任务),或者你的可用资源不足
(这也是OLTP系统中很典型的情况),其中CPU和I/O资源通常已经得到最大限度的使用,那就根本不用 考虑并行执行。

关于并行处理的类比

我经常使用一个类比来描述并行处理,解释为什么需要有一个大任务,还要求数据库中有足够多的空 闲资源。这个类比是写一个有10章的详尽报告,每一章之间都要相互独立。例如,可以考虑你手上的这本 书。本章与第9 章是独立的,不必按先后顺序写这两章。
如何完成这两个任务?你认为并行处理对哪个任务有好处?

1. 一页的总结

在这个类比中,第一个任务是要完成只有一页的总结,这并不是一个大任务。你可以自己来写,也可 以把这个任务安排给某个人。为什么呢?因为倘若将这个处理“并行化”,所需的工作量反而会超过你自己 写这一页所需的工作。如果要实现“并行化”,你可能必须坐下来,想清楚应该有12段,并确定每一段不 能依赖于其他段落,然后召开一个小组会议,选择12个 人,向他们解释问题是什么,并安排每个人完成 一段,然后作为一个协调员收集所有段落,按正确的顺序摆好,验证这些段落无误,然后打印报告。与你 自己串行地 写这一页相比,上述过程很可能需要花费更长的时间。对于这样一个小规模的项目,管理这么 一大群人的开销远远超过了并行编写12段所能得到的收益。
数据库中的并行执行也是同样的道理。如果一个任务只需要几秒(或更短时间)就能串行地完成,引 入并行执行后,相关的管理开销可能会让整个过程花费更长的时间。

2. 10 章的报告

现在再来分析第二个任务。你希望你尽快地写出这个10章的报告,对此最慢的办法就是将所有工作
都安排给某一个人(相信我说的话,因为我很清楚这一点,看看这本书就知道了!有时我真是希望能有 15 个“我”在同时写)。此时,你要召开会议,审查处理步骤,分配工作,然后作为协调员收集结果,完成最 后的报告并提交。这个过程可能不是在1/10的时间内完成,而可能在1/8左右的时间内完成。同样,这么 说有一个附加条件,你要有足够的空闲资源。如果你的员工很多,而且目前手头都没有什么具体工作,那 么划分这个工作绝对是有意义的。
不 过,假设你是经理,请考虑以下情况:你的员工可能手头有很多任务。在这种情况下,就必须谨 慎对待这个大项目。你要保证不要让你的员工疲于奔命;你不希望他 们过度疲劳,超过承受极限。如果你 的资源(你的员工)无力处理,你就不能再分配更多的工作,否则他们肯定会辞职。如果你的员工已经是 满负荷的,增加更多的 工作只会导致所有进度都落空,所有项目都延迟。
Oracle 中的并行执行也是一样。如果一个任务要花几分钟、几小时或者几天的时间执行,引入并行 执行可能会使这个任务的运行快上8倍。但是,重申一遍,如果资源已经被过度使用(员工已经超负荷工 作),就要避免引入并行执行,因为系统可能会变得更迟钝。尽管Oracle服务器进程不会递交“辞职书”, 但它们可能会用完所有的RAM并失败,或者只会长时间地等待I/O或CPU,看上去就好像没有做任何工作 一样。
如 果牢记这个类比(但要记住不能不合理地过分夸大类比),对于并行化是否有用,你就有了一个常 识性的指导原则。如果有一个任务需要花几秒的时间完成,要想通 过使用并行执行让它更快一些,就很可 能成问题,而且通常可能适得其反。如果已经在过度使用资源(也就是说,你的资源已经得到充分利用), 再增加并行执行很 可能会使情况更糟,而不是更好。如果有一个相当大的任务,而且有充分的额外资源, 并行执行就再合适不过了。在这一章中,我们将介绍充分利用执行资源的一些 方法。