暂无图片
暂无图片
12
暂无图片
暂无图片
1
暂无图片

八千字带你了解 Oracle 并行那些事(一)

478

大家好,我是 JiekeXu,江湖人称“强哥”,青学会 MOP 技术社区主席,荣获 Oracle ACE Pro 称号,墨天轮 MVP,墨天轮年度“墨力之星”,拥有 Oracle OCP/OCM 认证,MySQL 5.7/8.0 OCP 认证以及 PCA、PCTA、OBCA、OGCA、KCP 等众多国产数据库认证证书,今天和大家一起来看看八千字带你了解 Oracle 并行那些事(一),欢迎关注我的微信公众号“JiekeXu DBA之路”,然后点击右上方三个点“设为星标”置顶,更多干货文章才能第一时间推送,谢谢!

facebook_pro_light_1920 × 1080  副本.png

一)并行执行的工作原理	
	SQL 语句的并行执行过程	
	生产者/消费者模型	
	并行粒度	
	生产者和消费者之间的分配方式	
	并行执行服务器如何通信	
二)并行的相关概念	
	并行执行相关视图	
三)并行查询	
四)并行DML	
	默认并行度	
	LOB 列的并行
        并行 DML 的限制		
五)并行创建表	
六)并行创建索引	
七)并行收集统计信息	
八)Rman 备份的并行	
九)23ai 并行新特性	
十)参考链接
复制

前  言

Oracle 并行是指在执行一个 SQL 语句时,通过分配多个进程同时执行数据的扫描、聚合等操作,在此过程中也会使用更多的 CPU、IO 等资源,使其 SQL 的响应时间更快。并行执行是充分利用硬件资源,以硬件资源换时间,处理大量数据时的核心技术。在我们实际工作中,由于使用不当,并行操作无法并行,或者并行执行计划效率低下,没有获得期望的性能提升。了解 Oracle 的并行操作,有利于我们更好更快的完成工作。

一)并行执行的工作原理

并行执行将任务分解,这样一来,不是一个进程完成查询中的所有工作,而是多个进程同时完成部分工作。

SQL 语句的并行执行过程

每个 SQL 语句在解析时都会经历优化和并行化过程。

如果确定语句要并行执行,则执行计划中将发生以下步骤:

  1. 用户会话或影子进程充当协调器的角色,通常称为查询协调器 (QC) 或并行执行 (PX) 协调器。QC 是启动并行 SQL 语句的会话。
  2. PX 协调器获取必要数量的进程,称为并行执行 (PX) 服务器。PX 服务器是代表启动会话并行执行工作的单个进程。
  3. SQL 语句作为一系列操作执行,例如全表扫描或 ORDER BY 子句。如果可能,每个操作都并行执行。
  4. 当 PX 服务器完成语句执行后,PX 协调器将执行无法并行执行的任何工作部分。例如,带有 SUM() 运算的并行查询需要将每个 PX 服务器计算出的单独小计相加。
  5. 最后,PX 协调器将结果返回给用户。

生产者/消费者模型

并行执行使用生产者/消费者模型。

并行执行计划以一系列生产者/消费者操作的形式执行。为后续操作生成数据的并行执行 (PX) 服务器称为生产者,需要其他操作输出的 PX 服务器称为消费者。每个生产者或消费者并行操作由一组称为 PX 服务器集的 PX 服务器执行。PX 服务器集中的 PX 服务器数量称为并行度 (DOP)。PX 服务器集的基本工作单元称为数据流操作 (DFO)。

PX 协调器可以具有多级生产者/消费者操作(多个 DFO),但 PX 协调器的 PX 服务器集数量限制为两个。因此,在某个时间点,PX 协调器只能有两个 PX 服务器集处于活动状态。因此,DFO 中的操作和 DFO 之间的操作都存在并行性。单个 DFO 的并行性称为操作内并行性,DFO 之间的并行性称为操作间并行性。为了说明操作内和操作间并行性,请考虑以下语句:
SELECT * FROM employees ORDER BY last_name;
执行计划对employees雇员表进行全面扫描。此操作之后,根据 last_name 列的值对检索到的行进行排序。为了便于说明,假设 last_name 列未编入索引。还假设查询的 DOP 设置为 4,这意味着对于任何给定操作,可以有 4 个并行执行服务器处于活动状态。

image.png

如图所示,尽管 DOP 为 4,但实际上有 8 个 PX 服务器参与查询,这是因为生产者和消费者操作符可以同时执行(操作间并行性)。

此外,参与扫描操作的所有 PX 服务器都会将行发送到执行 SORT 操作的相应 PX 服务器。如果 PX 服务器扫描的行包含 A 和 G 之间的 last_name 列的值,则该行将发送到第一个 ORDER BY 并行执行服务器。扫描操作完成后,排序过程可以将排序结果返回给查询协调器,查询协调器再将完整的查询结果返回给用户。

并行粒度

并行中的基本工作单元称为颗粒。

Oracle 数据库将并行执行的操作(例如表扫描或索引创建)划分为多个颗粒。并行执行 (PX) 服务器每次执行一个颗粒的操作。颗粒的数量及其大小与并行度 (DOP) 相关。颗粒的数量还会影响 PX 服务器之间的工作平衡程度。

块范围粒度

块范围粒度是大多数并行操作的基本单位,即使在分区表上也是如此。从 Oracle 数据库的角度来看,并行度与分区数无关。

块范围粒度是表中物理块的范围。Oracle 数据库在运行时计算粒度的数量和大小,以优化和平衡所有受影响的并行执行 (PX) 服务器的工作分配。粒度的数量和大小取决于对象的大小和 DOP。块范围粒度不依赖于表或索引的静态预分配。在计算粒度期间,Oracle 数据库会考虑 DOP,并尝试将来自不同数据文件的粒度分配给每个 PX 服务器,以尽可能避免争用。此外,Oracle 数据库还会考虑大规模并行处理 (MPP) 系统上粒度的磁盘亲和性,以利用 PX 服务器和磁盘之间的物理接近性。

分区颗粒

当使用分区粒度时,并行执行 (PX) 服务器会对表或索引的整个分区或子分区进行操作。
由于分区粒度是在创建表或索引时由表或索引的结构静态确定的,因此分区粒度无法为您提供块粒度所能提供的并行执行操作的灵活性。允许的最大并行度 (DOP) 是分区数。这可能会限制系统的利用率和 PX 服务器之间的负载平衡。

当使用分区粒度并行访问表或索引时,应使用相对较大数量的分区,理想情况下是 DOP 的三倍,以便 Oracle 数据库可以有效地在 PX 服务器之间平衡工作。
分区颗粒是并行索引范围扫描、查询优化器选择使用分区连接的两个均等分区表之间的连接以及修改分区对象的多个分区的并行操作的基本单位。这些操作包括并行创建分区索引和并行创建分区表。

通过查看语句的执行计划,您可以判断使用了哪些类型的粒度。表或索引访问上方的 PX BLOCK ITERATOR 行表示已使用块范围粒度。在下面的示例中,您可以在 SALES 表的 TABLE FULL ACCESS 上方的解释计划输出的第 6 行上看到这一点。

image.png

当使用分区粒度时,您会在解释计划输出中的表或索引访问上方看到行 PX PARTITION RANGE。在下面的示例的第 6 行中,该计划具有 PX PARTITION RANGE ALL,因为此语句访问了表中的所有 16 个分区。如果没有访问所有分区,则仅显示 PX PARTITION RANGE。

image.png

生产者和消费者之间的分配方式

分发方法是将数据从一个并行执行 (PX) 服务器集发送(或重新分发)到另一个服务器集的方法。

以下是并行执行中最常用的分配方法。

  • 哈希分布

哈希分布方法对行中的一个或多个列使用哈希函数,然后确定生产者应将行发送到哪个消费者。此分布尝试根据哈希值在消费者之间平均分配工作。

  • 广播分发

在广播分发方法中,每个生产者将所有行发送给所有消费者。当连接操作左侧的结果集较小且广播所有行的成本不高时,使用此方法。在这种情况下,连接右侧的结果集不需要分发;分配给连接操作的消费者 PX 服务器可以扫描右侧并执行连接。

  • 范围分布

范围分布主要用于并行排序操作。在此方法中,每个生产者将具有一定范围值的行发送给同一个消费者。

  • 混合哈希分布

混合哈希是用于连接操作的一种自适应分布方法。实际分布方法由优化器在运行时根据连接左侧的结果集大小决定。计算从左侧返回的行数并将其与阈值进行核对。当行数小于或等于阈值时,将对连接的左侧使用广播分布,而不对右侧进行分布,因为分配给连接操作的相同消费者 PX 服务器将扫描右侧并执行连接。当从左侧返回的行数高于阈值时,将对连接的两侧都使用哈希分布。

为了确定分布方法,并行执行 (PX) 协调器会检查 SQL 语句执行计划中的每个操作,然后确定必须在 PX 服务器之间重新分布操作所操作的行的方式。

查询计划显示 PX 协调器选择了自适应分布方法。假设优化器在运行时选择哈希分布,则执行过程如下:为查询分配两组 PX 服务器 SS1 和 SS2,由于 PARALLEL 提示指定了语句的 DOP,因此每组服务器都有四个 PX 服务器。

PX 集 SS1 首先扫描表 customers 并将行发送到 SS2,SS2 在这些行上构建哈希表。换句话说,SS2 中的消费者和 SS1 中的生产者同时工作:一个并行扫描客户,另一个并行消费行并构建哈希表以启用哈希连接。这是操作间并行性的一个例子。

SS1 中的 PX 服务器进程扫描客户表中的一行后,应该将其发送给 SS2 中的哪个 PX 服务器进程?在这种情况下,从执行客户并行扫描的 SS1 流向执行并行哈希连接的 SS2 的行的重新分配是通过对连接列进行哈希分配来完成的。也就是说,扫描客户的 PX 服务器进程对列 customers.cust_id 的值计算哈希函数,以决定将其发送给 SS2 中的哪个 PX 服务器进程。使用的重新分配方法在查询的 EXPLAIN PLAN 中的 Distrib 列中明确显示。在图 8-2 中,可以在 EXPLAIN PLAN 的第 5、9 和 14 行中看到这一点。

SS1 扫描完整个客户表后,将并行扫描销售表。它将行发送到 SS2 中的 PX 服务器,然后后者执行探测以并行完成哈希连接。这些 PX 服务器还会在连接后执行 GROUP BY 操作。SS1 并行扫描销售表并将行发送到 SS2 后,将切换到并行执行最后的分组操作。此时,SS2 中的 PX 服务器使用哈希分布将其行发送到 SS1 上的 PX 服务器以执行分组操作。这就是两个服务器集如何并发运行以实现查询树中各个运算符之间的操作间并行性。

并行执行服务器如何通信

为了并行执行查询,Oracle 数据库通常会创建一组生产者并行执行服务器和一组消费者并行执行服务器。

生产者服务器从表中检索行,消费者服务器对这些行执行连接、排序、DML 和 DDL 等操作。生产者集中的每个服务器都与消费者集中的每个服务器建立连接。并行执行服务器之间的虚拟连接数随着并行度的平方而增加。

每个通信通道至少有一个,有时最多有四个内存缓冲区,这些缓冲区是从共享池中分配的。多个内存缓冲区有助于并行执行服务器之间的异步通信。

单实例环境每个通信通道最多使用三个缓冲区。Oracle Real Application Clusters 环境每个通道最多使用四个缓冲区。下图说明了消息缓冲区以及生产者并行执行服务器如何连接到消费者并行执行服务器。

image.png

当连接位于同一实例上的两个进程之间时,服务器通过在内存(共享池中)中来回传递缓冲区进行通信。当连接位于不同实例中的进程之间时,消息通过互连使用外部高速网络协议发送。在上图中,DOP 等于并行执行服务器的数量,在本例中为 n。上图未显示并行执行协调器。每个并行执行服务器实际上都有一个与并行执行协调器的额外连接。

使用并行执行时,适当调整共享池的大小非常重要。如果共享池中没有足够的可用空间来为并行服务器分配必要的内存缓冲区,则并行服务器将无法启动。

由于本节内容比较多,剩下的部分后面我们在接着看,今天就到这里吧。本文前面全是枯燥的文字,估计大家也不想看,没关系,后面的内容全是实用干货了,敬请期待,想看的点zan 转fa 走起来,这样我就有动力更新了,灰常感谢~~~

全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~

欢迎关注我的公众号【JiekeXu DBA之路】,一起学习新知识!
——————————————————————————
公众号:JiekeXu DBA之路
墨天轮:https://www.modb.pro/u/4347
CSDN :https://blog.csdn.net/JiekeXu
ITPUB:https://blog.itpub.net/69968215
腾讯云:https://cloud.tencent.com/developer/user/5645107
——————————————————————————
facebook_pro_light_1920 × 1080  副本.png

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

星星之火
暂无图片
2月前
评论
暂无图片 0
Oracle 并行是指在执行一个 SQL 语句时,通过分配多个进程同时执行数据的扫描、聚合等操作,在此过程中也会使用更多的 CPU、IO 等资源,使其 SQL 的响应时间更快。
2月前
暂无图片 点赞
评论