Oracle与并行性

并行化操作能力是巨型数据库(Very

Large

Database,简称VLDB)最重要的特性之一。带有多个CPU的数据库服务器,也被称作SMP,目前是大多数数据库服务器的标准配置。当性能需求以

及数据量不断的增长,更加需要使用多处理器和多磁盘来减少完成给定任务所需的时间。通过运行实时应用集群,Oracle即可支持单SMP服务器中的并行,

还可以支持多个节点间的并行。以并行方式执行一个SQL语句将消耗更多的机器资源——CPU,内存和磁盘I/O——但是可以缩短整个任务的完成时间。

并行操作以一种比较线性的方式影响着执行一个给定任务所需要的内存数量和CPU资源。每个并行执行进程都有一个PGA(Program

Global Area,程序全局区),它需要占用一定的内存来完成工作。每个并行执行进程会占用自己的CPU时间片,但是很多并行进程都可以减少磁盘I/O的时间,磁盘I/O往往是瓶颈最容易产生的地方。

Oracle数据库中存在两种可能的并行类型:

块-范围(block-range)并行

有数据库块的范围驱动。

基于分区的并行

由操作中涉及的一定数量的分区或子分区驱动。

下面几节将描述这两种类型的并行。

块-范围并行

1994年,Oracle

7.1引入了动态并行化表扫描和各种基于扫描的函数的能力。这种类型的并行是基于块范围(block-range)的概念,Oracle服务器将了解每个

表中包含了一组数据块,而每个数据块涵盖了一个指定范围的数据。Oracle

7通过动态的把一个表分解成几块来实现块-范围并行,分解得到每一个块就是一个数据块的范围,然后以并行的方式用多进程来处理这些分解的块。Oracle

的块-范围并行的实现是独一无二的,因为它不要求对表进行物理分区。

有了这种类型的并行,发出SQL语句的客户会话将透

明地成为并行执行协调器,它将动态的确定块范围并把它们分配给一组并行执行(PE)进程。一旦PE进程完成了一个分配的块范围,它就返回给协调器以便请求

下一步的工作。不是所有的I/O都以相同的速率发生,因此一些PE进程可能比另一些PE进程处理更多的数据块。“stealing

work”的概念允许所有的进程充分参与各项任务,从而最大限度的利用主机资源。

如果有足够的硬件资源,那么块-范围并行的规模与

PE进程的数量成线性关系。实现并行的伸缩性关键在于硬件基础。每个PE进程均运行在一个CPU上,并且只对一个设备请求I/O。如果有足够的CPU去读

取足够的磁盘,并行将成比例扩展。如果系统在这些资源中的某一点遇到一个瓶颈,伸缩性则会受到影响。例如,有4个CPU,但是只读取2个磁盘,那么并不会

是磁盘的双路伸缩性成倍增长;如果额外的CPU会导致磁盘竞争,那么还会带来并行能力的下降。同样的,2个CPU读取20个磁盘也不会成比例的将性能提高

20倍。系统硬件必须在并行的同时依照比例关系进行平衡。

大多数的大型系统中,磁盘数量要远远大于CPU的数量。在这些系统中,并行导致了I/O和I/O子系统的随机化。这对于不同用户的PE进程在不同时间读取不同磁盘的并行数据方式是很有用的,因为它使得I/O分布在多个可用的磁盘上。

打个比方,动态的并行性犹如吃馅饼。这个馅饼就像是

该操作要读取的一组数据块,并且目的是尽可能块的让一定数量的人吃掉这个馅饼。Oracle按份来提供这个馅饼,当其中一个人吃完它的第一份时,他可以再

回去要跟多份。并不是每个人都以相同的速度吃馅饼,因此某些人将会比其他一些人吃得多。这种方法在现实世界中稍微显得有些不公平,但对于并行来说它是一种

很好的模式,因为如果每个人自始自终一直在吃,这个馅饼将会以更快的速度被吃掉。另一种选择就是给每个人相同份数的馅饼,并一直等着吃得最慢的人吃完它的

那份。

图7-5显示了将一组数据块分割成几个数据区间。

图7-5 动态的块-范围并行化

表的范围与表的分区

在Oracle

8中引入了分区表,一个操作可能会涉及到一个分区表中的一个,多个或所有的分区。对于一个常规的表而言,块-范围并行机制将动态地分割一组数据块以便读

取,这一点与分区表并没有本质的区别。一旦优化器确定了操作该访问哪一个分区,所有涉及到的分区的数据块则都被看做是一个分割成多个数据区间的池。

优化器的这种假设导致了使用并行和分区表的一个关键

问题。并行度(即用于整个表的并行执行进程的数目)需要应用到某一项操作所用的一组分区上。如果分区中没有包含操作要用的数据,那么优化器就会排除这一分

区。例如,如果一个表的某个分区包含的ID号在1000以下,而若要查询请求ID号在1100和5000之间,优化器就会知道这项查询不可能访问这个分

区。

从Oracle 9i开始,你也可以基于一组特定的值来对表进行分区,不过这种类型的分区通常适合于维护操作的分区表。正如第4章讲述的那样,Oracle一直在添加更多的实施分区的方法。

如果你期望你的查询使用分区排除或修剪而且计划采用

并行性,那么你应该在足够多的驱动器上条带化每个分区从而使之能够有效的扩展。这种做法不论访问分区的数目大小都可以确保可扩展性。条带化的工作可以通过

在多个磁盘上保存多个数据文件的方法手工完成。这些磁盘可以以条带化的形式组成阵列,也可以结合这两种方法组成阵列。

什么可以实现并行化?

Oracle不仅仅能够对简单的查询进行并行化,而且还能够对许多操作执行块-范围并行化,具体包括:

*表空间的创建

*索引的创建与重建

*在线索引的重组与重建

*根据索引组织的表的重组与重建

*表的创建,例如使用CREATE TABLE …AS SELECT

*分区维护操作,例如迁移与分割分区

*数据加载

*完整性约束的实施

*统计的收集(从Oracle数据库10g开始可自动收集)

*备份与恢复(在Oracle数据库11g中包含大型文件)

*DML操作(INSERT,UPDATE,DELETE)

*查询处理操作

*OLAP集合(就Oracle数据库10g而言)

Oracle还能够为各个查询处理步骤提供并行化的优势。可能实现并行化的查询处理特性包括:

*表扫描

*嵌套循环

*排序合并关联

*哈希关联

*位图星型关联

*索引扫描

*面向分区的关联

*反关联(NOT IN)

*SELECT DISTINCT

*UNION和UNION ALL

*ORDER BY

*GROUP BY

*聚集

*导入

*用户自定义函数

并行度

Oracle实例有一个对于数据库用户可用的PE进程池。这些进程会消耗CPU,内存和I/O资源。控制活跃PE进程的最大数量是很重要的;因为太多的PE进程将会给主机带来过重的负担,导致出现资源瓶颈和性能的退化。高度的并行性还会导致全表扫描,这种情况可能可能好

,也可能坏。图7-6显示了PE进程组内和组间的透明并行性。

图7-6 操作内和操作间的并发性

在有多个用户并且工作负荷不断变化的情况下,确定最

佳的并发度具有一定的挑战性。例如,当查询并发度为8的时候,就能够满足1到2个用户查询操作对性能的需求,但是如果有20个用户查询同一个表,又会怎么

样?这个时候可能需要160个PE进程(8个PE进程服务20个用户),这么多的PE进程可能会让机器超载。

将并行度设置为为最小的公共分母值(例如,2),在用户数较多的时候,能够提供有效的并行性,但是当用户较少的时候,并不能充分利用资源。

自调整适应性并行

Oracle

8i引入了自调整适应性并行(self-tuning adaptive

parallelism)的概念。当系统负责增加时,这个特性将自动的按比例减小并行度;当系统负载减少时,则会自动的成比例增大并行度。当某个操作要求

具有一定的并行度的时候,Oracle会检查系统的负载并降低实际操作并行度以避免系统负载过重。要求并行操作的用户越多,他们接受到的并行度就会越来越

低,直到操作连续的执行完毕。如果操作减少,随后的操作将赋予不断增大的并行度。这种适应性可以把DBA从本来不可能做到的任务中解放出来,这个不可能的

任务就是在面对并发性和工作负载不断变化的条件下确定最佳的并行度。

在确定赋予一项操作的并行度的过程中,自适应并行要考虑两个因素:

*系统负荷

*在数据库资源管理器活跃的条件下,用户客户群体的并行资源限制。(第9章以及本章的后面将会讲述数据库资源管理器)这一点非常重要,因为这意味着如果存在自适应并行,就还需要考虑资源的规划。

基于分区的并行性

对于需要实现并行的语句,Oracle并行功能的小

子集则基于该语句所访问的分区或子分区的数据。对于块-范围并行,每个PE进程工作所需的数据片为数据块的范围;对于基于分区的并行,驱动并行的数据片是

指一个表的分区或子分区。需要根据分区或者子分区的数目来进行并行化的操作有:

*更新和删除操作

*索引扫描操作

*分区表上的索引创建和重建

表分区和子分区的并行

Oracle 8引入了对并行DML(数据操作语言)的支持,即支持并行的执行INSERT,UPDATE,和DELETE语句。这种类型的并行改进大量数据操作(例如,更新一个大型表中所有行的操作)的性能。

在Oracle

8中更新和删除操作的并行度与涉及到的分区数量是密切相关的;而对于Oracle

8i及以后版本,更新和删除操作的并行度则与涉及到的分区或子分区的是数量有关。一个有12个分区的表(例如,每个分区对应一年中的每个月)对于并行更新

和删除操作可以拥有最大为12的并行度。仅对一个月的数据进行更新操作不会并行,因为它只涉及到一个分区。如果通过使用Oracle的复合分区(例如,每

个月分区中根据PRODUCT_ID再分为4个哈希子分区)创建一个表,对于整个表最大的并行度将是48,即有12个分区,每个分区又有4个子分区。因此

对于一个月数据的更新操作并行度可以为4,因为每个月包含4个哈希子分区。如果这个表没有被分区,Oracle就不能以并行的方式执行更新操作。

在Oracle 8以及之后的版本中,可以使用类似于并行DML的语义,即每个索引分区或子分区对应一个PE进程,同时以并行的方式对分区的索引执行创建,重建,和扫描操作。

对未分区的表进行快速完全索引扫描

人们常常会认为只有对目标索引进行分区之后

Oracle数据库才能并行处理索引扫描。Oracle

7.3引入了在某些场合下对未分区的表进行快速完全索引扫描的功能。如果索引扫描操作是“不受约束的”,即对整个索引的访问为了满足查询的需求,那么

Oracle

7.3及更高的版本将使用块-范围并行机制,从而并行化对整个索引的访问。因此,当Oracle可以对未分区的表进行快速完全索引扫描时,这个特性适用于

范围有限的查询。基于分区的索引扫描则适用于更大范围的查询操作。

未分区表和分区表的并行插入操作

Oracle可以通过INSERT INTO

tableX SELECT …FROM

tableY这样的语句以并行的方式对未分区表和分区表执行一条插入语句。Oracle用一组PE进程对插入语句中SELECT部分执行块-范围并行化。

这些PE进程把多行数据传递到第二组PE进程,第二组PE进程再把这些数据插入到目标表中。目标表可以是未分区表,也可以是分区表。因此,插入操作的并行

不是严格意义下的块-范围并行或基于分区的并行。

oracle并行parallel update两张表_Oracle与并行性 parallel相关推荐

  1. oracle并行parallel update两张表_Oracle并行更新的两种方式(merge/update内联视图)

    对于Oracle的两表联合更新的场景(有A.B两表,以A.id=B.id关联,根据B表中的记录更新A表中的相应字段),一般有update内联视图和merge两种方式,下面举例介绍: 创建用例表: cr ...

  2. MySQL和Oracle中如何update一张表中的字段赋值给另一张表的字段

    MySQL 中实现将 一张表table1 中的字段name 等于table2 中的字段 name 通过相同字段no相连,实现如下: update table1 a1,table2 a2 set a1. ...

  3. oracle两张表 比较好,比较Oracle两张表的数据是否一样

    比较Oracle两张表的数据是否一样 爱搞机 2008-10-21 11:00 在某些情况下,我们会需要比较两张表的数据是否一样. 假设有两张表A与表B他的字段相同,但是当中的数据可能不同,而且有些字 ...

  4. 比较两张表的数据是否相同

    在某些情况下,我们会需要比较两张表的数据是否一样. 假设有两张表A与表B他的字段相同,但是当中的数据可能不同,而且有些字段的数据还有可能为空 方法一(手动):把需要比较的两张表的数据按照某种规则排序后 ...

  5. oracle:一个update修改两张表

    需求:用一个update语句修改两张表? 思路:用触发器来解决 触发器代码: 表a:table_a,表b:table_b,其中表b里面有表a的id,这个触发器意思是当修改表a的最后修改人:table_ ...

  6. 在同一个workprocess里对两张表分别使用online update和update function module update

    Created by Jerry Wang, last modified on Jul 22, 2014 有两张表: 用一个report测试,表1是直接online update,表2在update ...

  7. oracle 两表两列数据对比_【SQL】根据两列信息,整合两张表数据

    两张表数据如下: --2017年 id college score A001 北京大学 670 A002 中国人民大学 646 A003 清华大学 664 A003 清华大学         (定向) ...

  8. oracle横向合并两张表,SQL中将两个表合并成一个新表 SQL如何合并两个表并生成一个新表?...

    sql把两个表合并成一个新表的语句应该怎么写SQL SERVER: select * into 表3 from ( select 字段列表1 from 表1 union all select 字段列表 ...

  9. Oracle 对比两张表的数据是否一致

    使用 minus 关键字(minus:差别,缺少) 有两张表CHECK_CITY_1和CHECK_CITY_2,现在要互相对比一下,两个表数据的差异,(即A中有哪些B里没有,B中有哪些A中没有) se ...

最新文章

  1. 射灯安装方法图解_客厅适合用射灯做基础照明吗?又该如何布灯?
  2. ListView通过自定义适配器来显示数据并对Item项以及子view项的控件实现监听.
  3. 【正一专栏】走过2017——坚持
  4. java jxl map,jxl操作Excel
  5. Lua直接调用动态链接库(DLL或so文件)
  6. 【目录】Django-2.0 学习笔记
  7. 为什么写Java程序需要接口
  8. Ubuntu系统下载缓慢,以及更新源卡住不动(终极解决方案)
  9. Hive之函数与自定义函数
  10. 「总结」 MLEAutoMaton的各种板子总结
  11. matlab的v带优化设计,基于遗传算法及MATLAB的V带传动优化设计
  12. ELK 企业内部日志分析系统
  13. 我的CSDN原创高质量免积分下载资源列表(持续更新)
  14. C++ 会议安排(贪心算法)
  15. Java常用开源框架
  16. MPEG压缩中的 I、B、P帧
  17. Mac动画交互设计软件Principle
  18. pyecharts各省人口GDP可视化分析
  19. 什么是内部类,以及内部类的特点
  20. [体感游戏]关于体感游戏的一些思考(六)--- 飞行

热门文章

  1. 容器服务Windows Kubernetes使用阿里云日志服务来收集容器日志
  2. 一文读懂深度学习:从神经元到BERT
  3. 第一个将Palette Mode引入VVC(H.266),阿里云在JVET会议上引起关注
  4. 为什么深度学习没有取代传统的计算机视觉?
  5. 场景联创 施耐德电气“绿色智能制造创赢计划”第二季收官
  6. CSDN 开学见面礼!3 周带你 Get 大厂工程师基础能力
  7. 浪潮云发布全新“1231”业务战略,打造“一朵分布式云”
  8. 微服务精华问答 | 为什么需要微服务?
  9. 漫画 | Kubernetes带你一帆风顺去远航
  10. jquery中ajax完整例子get,jq的ajax方法,jquery中ajax完整例子