大家好,我是 JiekeXu,江湖人称“强哥”,青学会 MOP 技术社区主席,荣获 Oracle ACE Pro 称号,墨天轮 MVP,墨天轮年度“墨力之星”,拥有 Oracle OCP/OCM 认证,MySQL 5.7/8.0 OCP 认证以及 PCA、PCTA、OBCA、OGCA、KCP 等众多国产数据库认证证书,今天和大家一起来看看八千字带你了解 Oracle 并行那些事(一),欢迎关注我的微信公众号“JiekeXu DBA之路”,然后点击右上方三个点“设为星标”置顶,更多干货文章才能第一时间推送,谢谢!
一)并行执行的工作原理 SQL 语句的并行执行过程 生产者/消费者模型 并行粒度 生产者和消费者之间的分配方式 并行执行服务器如何通信 二)并行的相关概念 并行执行相关视图 三)并行查询 四)并行DML 默认并行度 LOB 列的并行 并行 DML 的限制 五)并行创建表 六)并行创建索引 七)并行收集统计信息 八)Rman 备份的并行 九)23ai 并行新特性 十)参考链接
复制
废话不多说,干货来了,赶快收藏点赞转发起来吧,接上文,八千字带你了解 Oracle 并行那些事(一)
二)并行的相关概念
并行执行可将多个 CPU 和 I/O 资源用于执行单条 SQL 语句。
并行执行有时也称为并行性。所谓并行,就是将任务分解,让多个进程同时进行部分工作,而不是由一个进程完成查询中的所有工作。举例来说,当四个进程共同计算一年的总销售额时,每个进程处理一年中的一个季度,而不是由一个进程单独处理所有四个季度。这对绩效的提高是非常显著的。
首先我们来了解两个基本概念:
并行度(Degree of parallelism):单个操作所关联的并行执行服务器个数。
并行执行服务器(Parallel Execution Servers):当数据库实例启动后,数据库创建一个并行执行服务器池以供并行操作. 一个叫 parallel execution coordinator的进程负责分配Parallel Execution Servers并协调把并行执行的结果返回给用户,默认情况下Parallel Execution Servers处于开启状态。
SQL> show parameter parallel_max_servers NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ parallel_max_servers integer 16 <-----非零值
复制
Oracle根据下面的规则来确定并行度,如果指定或请求并行执行,但没有指定并行度,默认的并行度被设置为系统CPU核数的两倍,对RAC系统,并行度设置为整个集群的cpu核数的两倍,因此 parallel_max_servers 最大并行参数值为 cpu*2。
SQL> show parameter cpu_count NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ cpu_count integer 8
复制
默认情况下,并行操作会分发到RAC的各个节点,而在很多生产环境下,我们并不希望并行跨节点执行,此时就需要设置该参数为 TRUE:
SQL> alter system set parallel_force_local=true sid=’*’; SQL> show parameter parallel_force NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ parallel_force_local boolean TRUE SHARED_POOL_SIZE:
复制
除了串行 SQL 执行所需的内存资源外,并行执行还需要内存资源。额外的内存用于在查询服务器进程和查询协调器之间通信和传递数据。Oracle 从共享池中为查询服务器进程分配内存。如果没有足够的可用内存,则会出现错误消息 12853(PX 缓冲区内存不足:当前字符串K,最大所需字符串K)。这是由于可用于 PX 缓冲区的 SGA 内存不足造成的。您必须重新配置 SGA 以至少具有 (MAX - CURRENT) 字节的额外内存。
并行执行相关视图
V$PQ_TQSTAT视图:
即使有explan_PLAN和sql_traces输出,还是很难准确地解释并行查询是如何执行的,例如,实际的并行度是什么,每个并行服务进程都做了哪些工作?v$pq_tqstat视图包含了有关并行查询服务器的每个集合间传输的信息,包括发送和接收的行数。不过这个视图仅对发送并行查询的会话和最近执行过的查询是可见的。这些限制了它在产品中的使用,但在调优并行查询事,它是有作用的。
SELECT /*+ parallel */ DEPTNO,SUM(SAL) FROM emp GROUP BY DEPTNO ORDER BY 2 DESC; select * from v$pq_tqstat;
复制
v$px_session 视图:
通过检查vpx_session视图,我们可以实时得到系统上正在发生的并执行的视图,这个视图显示当前哪些并行子进程正在执行SQL,将vpx_session,vsession和vsql3个视图关联,使我们能识别出当前正在使用并行处理的会话和SQL,以及看到想要的和真实的并行度。
WITH px_session AS (SELECT qcsid,qcserial#,MAX(degree) degree,MAX(req_degree) req_degree,COUNT(*) no_of_processes FROM v$px_session p GROUP BY qcsid, qcserial#) SELECT s.sid, s.username, degree, req_degree, no_of_processes, sql_text FROM v$session s JOIN px_session p ON (s.sid = p.qcsid AND s.serial# = p.qcserial#) JOIN v$sql SQL ON (sql.sql_id = s.sql_id);
复制
V$PX_BUFFER_ADVICE 视图:
该视图提供有关所有并行查询的历史和预计最大缓冲区使用情况的统计信息。您可以查阅此视图以重新配置 SGA 大小,以响应并行查询的内存不足问题。
V$PX_PROCESS 视图:
使用 VPX_PROCESS 动态性能视图监控并行执行性能。VPX_PROCESS 视图包含有关并行进程的信息,包括状态、会话 ID、进程 ID 和其他信息。
V$PQ_SESSTAT 视图:
该视图显示系统中所有当前服务器组的状态,例如有关查询如何分配进程以及多用户和负载平衡算法如何影响默认值和提示值的数据。
SELECT NAME, VALUE FROM GV$SYSSTAT WHERE UPPER (NAME) LIKE '%PARALLEL OPERATIONS%' OR UPPER (NAME) LIKE '%PARALLELIZED%' OR UPPER (NAME) LIKE '%PX%';
复制
以下查询显示每个工作程序(子进程)的当前等待状态,并且查询协调器进程:
SELECT px.SID "SID", p.PID, p.SPID "SPID", px.INST_ID "Inst", px.SERVER_GROUP "Group", px.SERVER_SET "Set", px.DEGREE "Degree", px.REQ_DEGREE "Req Degree", w.event "Wait Event" FROM GV$SESSION s, GV$PX_SESSION px, GV$PROCESS p, GV$SESSION_WAIT w WHERE s.sid (+) = px.sid AND s.inst_id (+) = px.inst_id AND s.sid = w.sid (+) AND s.inst_id = w.inst_id (+) AND s.paddr = p.addr (+) AND s.inst_id = p.inst_id (+) ORDER BY DECODE(px.QCINST_ID, NULL, px.INST_ID, px.QCINST_ID), px.QCSID, DECODE(px.SERVER_GROUP, NULL, 0, px.SERVER_GROUP), px.SERVER_SET, px.INST_ID;
复制
三)并行查询
在书写 SQL 语句时我们仅需在 select 关键字后面添加一个 HINT /*+ parallel(n) */ 即可,而不需要在所有的查询下都加 HINT,这一点以前我也是不知道的,看了老虎刘的文章才明白,11g 以上已经变的更简单了,不用在考虑后面的多表关联,子查询等怎么添加 HINT。
Select /*+ parallel(8) */ count(*) from emp1; SELECT /*+ PARALLEL(8) */ customers.cust_first_name, customers.cust_last_name, MAX(QUANTITY_SOLD), AVG(QUANTITY_SOLD) FROM sales, customers WHERE sales.cust_id=customers.cust_id GROUP BY customers.cust_first_name, customers.cust_last_name;
复制
索引组织表支持多种并行扫描方法。
这些并行扫描方法包括
- 非分区索引组织表的并行快速全扫描
- 分区索引组织表的并行快速全扫描
- 分区索引组织表的并行索引范围扫描
- 对于有溢出区的索引组织表和包含 LOB 的索引组织表,可以使用这些扫描方法。
非分区索引组织表
对非分区索引组织表的并行查询使用并行快速全扫描。工作分配的方式是将索引段划分为足够多的块范围,然后以需求驱动的方式将块范围分配给并行执行服务器。与任何行对应的溢出块只能由拥有该行的进程以需求驱动的方式访问。
分区索引组织表
索引范围扫描和快速全扫描都可以并行执行。对于并行快速全扫描,并行化方法与非分区索引组织表相同。根据 DOP 的不同,每个并行执行服务器会得到一个或多个分区,每个分区都包含主键索引段和相关溢出段(如果有)。
SQL 查询只能在特定条件下并行执行。
只有满足以下条件之一,SELECT 语句才能并行执行:
- 查询包含语句级或对象级并行提示规范(PARALLEL 或 PARALLEL_INDEX)。
- 查询中引用的模式对象有与之相关的 PARALLEL 声明。
- 自动并行程度(Auto DOP)已启用。
- 使用 ALTER SESSION FORCE PARALLEL QUERY 语句强制执行并行查询。
此外,执行计划应至少包含以下内容之一:
- 全表扫描 A full table scan
- 跨越多个分区的索引范围扫描 An index range scan spanning multiple partitions
- 索引快速全扫描 An index fast full scan
- 并行表函数 A parallel table function
全文完,希望可以帮到正在阅读的你,如果觉得有帮助,可以分享给你身边的朋友,同事,你关心谁就分享给谁,一起学习共同进步~~~
欢迎关注我的公众号【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
——————————————————————————
评论

