oracle并行parallel update两张表_Oracle与并行性 parallel

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进程再把这些数据插入到目标表中。目标表可以是未分区表,也可以是分区表。因此,插入操作的并行

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建数组_如何创建数组

js数组js的数组不是典型的数组典型的数组元素的数据类型相同使用连续的内存储存通过数字下标获取元素但是js的数组不这样元素的数据类型可以不同内存不一定连续的(对象是随机储存的)不可以通过数字下标,而是通过字符串下标这意味着数组可以有…

node.js 实现udp传输_Node.js实战15:通过udp传输文件。

本文将要写一个udp服务器,和一个udp客户端,并实现客户端发送文件给服务器。服务器端代码如下:var dgram require("dgram");server();function server(){var socket dgram.createSocket("udp4");socket.on("messag…

mysql在单片机移植_移植MySQL到嵌入式ARM平台

因为MySQL5.5之后,编译是用的cmake不再使用./configure,因此,只好倒回支持./configure的版本来用,这里使用了文档上的5.1.51版本。进行如下步骤完成移植:1) 下载mysql5.1.51:http://www.mirrorservice.org/…

mysql镜像压缩包使用_如何连接docker的mysql镜像

展开全部推荐使用Dockerfile方式。服务的管理使用的是supervisord, 因为dockerfile里只会有一个cmd生效,如果我想62616964757a686964616fe58685e5aeb931333361326332通过ssh去管理容器还要有mysql服务的启动起来 cmd的方式就无法实现,当然容器不需要以sshd的方式去管…

mysql导出数据 程序_mysql导出数据

导出某库全表为SQL语句直接导出某库全表(包括表设计和表数据)为SQL语句mysqldump -h172.16.*.* -uroot -p somedatabase sometable > somewhere/table.sql导出某个表为特定文件格式导出某个表为特定文件格式(txt, xls)(只是数据)可以通过sql自行过滤某些数据mysql -h172.16.…

mysql通用日志不打印_解决logback不打印mybatis的SQL日志的问题

工作这么多年,今天还是因为Logback的这个问题稍微卡了一下,惭愧。问题描述:logback配置了如下信息:...此处省略File Appender内容${logbase}sql.%d{yyyy-MM-dd}.log30[%d{yyyy-MM-dd HH:mm:ss} [%t] [%X{traceId}] %5p %c:%L] %m%…

alibaba 实体转json_com.alibaba.fastjson 转换List Map等对象

原文:http://www.cnblogs.com/goody9807/p/4244862.html本文讲解2点:1. fastjson生成和解析json数据(举例:4种常用类型:JavaBean,List,List,List)2.通过一个android程序测试fastjson的用法。fastjson简介:Fastjson是一个Java语言编…

centos mysql rpm re_centos7和centos6.5环境rpm方式安装mysql5.7和mysql5.6详解

centos环境安装mysql5.7其实不建议安装mysql5.7 语法和配置可能和以前的版本区别较大,多坑,慎入1.yum方式安装(不推荐)a.安装mysql5.7 yum源centos6:wget dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpmyum localinstall mysql-community-…

mysql galera haproxy_安装配置Haproxy代理MySQL Galera集群

这篇文章,我讲介绍如何为MariaDB Galera 集群添加负载均衡,大致步骤如下:确认所有Galera节点作为一个单一集群运行(所有节点都是主节点而且相互同步)安装Haproxy(你可以安装到独立的服务器或者应用服务器)配置集群监控检测脚本,用…

nvme固态硬盘开机慢_为何我使用了固态硬盘开机速度还是需要20-30秒

1、加速网上邻居在Windows XP中访问网上邻居是相当恼人的,系统会搜索自己的共享目录和可作为网络共享的打印机以及计划任务中和网络相关的计划任务,然后才显示出来,显然这样速度就会比Windows 9x中慢很多。其实这些功能我们并没有使用上&…

高性能mysql看不懂_高性能mysql笔记1

转载请注明&#xff1a;TheViper http://www.cnblogs.com/TheViper<>这本书写的真的很好&#xff0c;只可惜本屌不才&#xff0c;大部分都看不懂&#xff0c;暂且记下与mysql优化有关&#xff0c;对自己有用的东西。测试指标吞吐量吞吐量指的是单位时间内的事务处理数&am…

python 热词分析_Python笔记:热词分析2020-01-01

热词分析在公众趋势分析、舆情分析有很宽广的应用&#xff0c;我们来看看怎么从一个TXT文件中分析出文章的热词出来&#xff0c;我们采用流行的第三方“结巴”包来实现。首先安装第三方包(matplotlib&#xff0c;jieba&#xff0c;wordcloud&#xff0c;numpy)mmatplotlib主要来…

子进程会继承父进程的哪些内容_【学习教程】Node.js创建子进程方法

来源 | https://github.com/CommanderXL/biu-blog/issues/25exec其中exec可用于在指定的shell当中执行命令。不同参数间使用空格隔开&#xff0c;可用于复杂的命令。const { exec } require(child_process)exec(cat *.js bad_file | wc -l)exec方法用于异步创建一个新的子进程…

python元编程运用_Python 中的元编程

就像元数据是有关数据的数据一样&#xff0c;元编程就是编写用于操纵程序的某些程序。人们普遍认为&#xff0c;元程序就是生成其他程序的某些程序&#xff0c;但范式更加广泛。所有旨在自我读取、分析、转换或修改的程序都是元编程的范例。例如&#xff1a;领域特定语言 (DSL)…

wamp怎么安装mysql服务器_用wamp的mysq安装pythonmysql

(我不确定这是应该在这里问还是在苏。。但是看到this question就这样&#xff0c;我在这里要求它…)我在我的vista机器上安装了wamp(mysql-5.1.33)服务器&#xff0c;我正试图安装pythonmysql 1.2.3c1&#xff0c;以使用wamp提供的mysql版本。在起初&#xff0c;当我运行python…

mysql筛选两个表有相同项的数据库_用SQL查询两个表中相同的数据

展开全部 1、创建测试表; create table test_col_1(id number, var varchar2(200)); create table test_col_2(id number, var varchar2(200)); 2、插入测试数据, insert into test_col_1 select level*8, var||32313133353236313431303231363533e59b9ee7ad9431333431373839l…

MySQL建表添加乐观锁字段_Java秒杀系统优化-Redis缓存-分布式session-RabbitMQ异步下单-页面静态化...

Java秒杀系统优化-Redis缓存-分布式session-RabbitMQ异步下单-页面静态化项目介绍基于SpringBootMybatis搭建的秒杀系统&#xff0c;并且针对高并发场景进行了优化&#xff0c;保证线程安全的同时极大地提高了服务器的吞吐量&#xff0c;主要优化手段有页面静态化、Redis缓存(页…

叶金荣mysql教程_mysql优化--叶金荣老师讲座笔记

copy to tmp table执行ALTER TABLE修改表结构时建议&#xff1a;凌晨执行Copying to tmp table拷贝数据到内存中的临时表&#xff0c;常见于GROUP BY操作时建议&#xff1a;创建索引Copying to tmp table on disk临时结果集太大&#xff0c;内存中放不下&#xff0c;需要将内存…

mysql tpcc 测试结果分析_mysql 数据库TPCC测试

创建数据库tpcc&#xff0c;导入测试表格mysql -h 192.168.0.202 -P15002 -utest -ptest -e "drop database tpcc;"mysql -h 192.168.0.202 -P15002 -utest -ptest -e "create database tpcc;"mysql -h192.168.0.202 -P15002 -utest -ptest --databasetpcc…

mysql 变量生命周期_Go: 延长变量的生命周期

![Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French.](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20191002-Go-Keeping-a-Variable-Alive/00.png)本文基于 Go 1.13。在 Go 中&#xff0…