Oracle使用并行踩过的坑

【引自朱wei的博客】一、并行机制的简述

并行处理的机制实际上就是把一个要扫描的数据集分成很多小数据集,Oracle会根据初始化参数 PARALLEL_MIN_SERVERS=n的值启动几个并行服务进程同时处理这些小数据集,***将这些结果汇总,作为最终的处理结果返回给用户。

二、并行使用场景

1、Parallel query(并行查询)

执行并行查询是需要符合以下条件:

A、SQL语句中有Hint提示,比如Parallel或者 Parallel_index。

B、SQL语句中引用的对象被设置了并行属性。

C、多表关联中,至少有一个表执行全表扫描(Fulltable scan)或者跨分区的Index range SCAN。

2、Parallel DDL(并行DDL操作,如建表,建索引等)

如:createtable xx parallel 4 as select * from xxx;

create index xxx on tab_xx(column) parallel 4;

3、Parallel DML(并行DML操作,如insert、update、delete等)

如:insert/*+parallel(t 2) */ into t select /*+parallel(t1 2) */ * from t1;

下面从以上三个场景各举一例来说一下并行易踩的坑。

三、并行对执行计划的影响

某日,开发突然找过来:喂、DBA吗?有个测试环境的SQL执行计划和生产环境不一样,严重影响测试进度。记得当时差不多是这样的,对方向我扔了一条执行计划有问题的SQL,然后不说话。作为一个菜鸟,赶紧把生产执行计划和测试环境对比了一下,发现果真不一样,折腾了好久,才发现该SQL中的某个表并行度为8,导致了执行计划异常。记得该表是TB级的大小,是个多表管理的查询语句,并行度为8之后走了全表扫描(Full table scan),可以想象是又多慢。因为是测试环境,谁做什么操作之后没有关闭并行就不深究了。下面看一下oracle联机文档:http://download.oracle.com/docs/cd/E11882_01/server.112/e10821/ex_plan.htm#PFGRF94687对并行处理的执行计划的解读。

  1. SQL>createtable emp2 as select * from scott.emp; 
  2.   
  3. SQL>altertable emp2 parallel 2;  --可以查看dba_tables表degree列 
  4.   
  5. SQL>explainplan for select sum(sal) from emp2 group by deptno; 
  6.   
  7. SQL> select * fromtable(dbms_xplan.display()); 
  8.   
  9. PLAN_TABLE_OUTPUT 
  10. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
  11. Plan hash value: 3939201228 
  12.   
  13. ------------------------------------------------------------------------------------------------------------------ 
  14. | Id | Operation              |Name     | Rows  | Bytes | Cost (%CPU)| Time     |        TQ  |IN-OUT| PQ Distrib | 
  15. ------------------------------------------------------------------------------------------------------------------ 
  16. |   0| SELECT STATEMENT    |         |         1|          26 |           2   (0)| 00:00:01 |          |         |                  | 
  17. |   1|  PX COORDINATOR           |         |          |           |                 |        |            |         |                 | 
  18. |   2|   PX SEND QC (RANDOM)          | :TQ10001 |  1 |          26 |           2  (0)| 00:00:01 |  Q1,01 | P->S |QC (RAND)  | 
  19. |   3|    HASH GROUP BY |         |         1 |         26 |           2  (0)| 00:00:01 |  Q1,01 | PCWP |                  | 
  20. |   4|     PX RECEIVE                  |         |         1 |         26 |           2  (0)| 00:00:01 |  Q1,01 | PCWP |                  | 
  21. |   5|      PX SEND HASH          | :TQ10000 |  1 |          26 |           2  (0)| 00:00:01 |  Q1,00 | P->P |HASH          | 
  22. |   6|       HASH GROUP BY    |         |         1 |         26 |           2  (0)| 00:00:01 |  Q1,00 | PCWP |                  | 
  23. |   7|        PX BLOCK ITERATOR |             |         1 |         26 |           2  (0)| 00:00:01 |  Q1,00 | PCWC |                  | 
  24. |   8|   TABLE ACCESS FULL| EMP2     |  1 |         26 |           2  (0)| 00:00:01 |  Q1,00 | PCWP |                  | 
  25. ------------------------------------------------------------------------------------------------------------------ 
  26.   
  27. Note 
  28. ----- 
  29.    -dynamic sampling used for this statement (level=2) 
  30.   
  31. 19 rows selected. 

 

当使用了并行执行,SQL的执行计划中就会多出一列:in-out。该列帮助我们理解数据流的执行方法。它的一些值的含义如下:

Parallel to Serial(P->S): 表示一个并行操作发送数据给一个串行操作,通常是并行incheng将数据发送给并行调度进程。

Parallel to Parallel(P->P):表示一个并行操作向另一个并行操作发送数据,疆场是两个从属进程之间的数据交流。

Parallel Combined with parent(PCWP): 同一个从属进程执行的并行操作,同时父操作也是并行的。

Parallel Combined with Child(PCWC): 同一个从属进程执行的并行操作,子操作也是并行的。

Serial to Parallel(S->P): 一个串行操作发送数据给并行操作,如果select 部分是串行操作,就会出现这个情况。

如果知道了这些含义,再去解析执行计划的执行步骤就很容易了。这里强调一下,在处理某些操作之后,对表或者索引等对象开启了并行的,一定要记得关闭,不然后果很严重。

四、并行建主键唯一性索引的影响

又是某日,开发欲在测试环境对某一大表建主键唯一性索引(前期未规划好),语句执行了很长时间,因为其它人还需调用该表,但长时间的锁表,造成了不可用,于是请求DBA帮助,我看了语句之后,给出建议建索引时加上并行并以nologing的方式,然后让开发自己再去执行,可不久后,开发又找过来说还是很慢,查看没有任何阻塞之后,决定好好看看是不是真的很慢。经过一番折腾,终于知道慢的原因了,建主键约束时不会用到并行。解决方案分两步走,先建唯一性约束,再加主键约束。如下:

1、开并行重建唯一索引:

create unique index schema.xxx onschema.table_name(column1,column2) parallel 16;

2、取消并行:alter indexschema.xxx noparallel; –索引建完后,一定记得取消并行

3、建主键约束:alter tableschame.xxx add constraint xxx primary key(column1,column2); –主键建立并行是没有效果的

相关测试这里就不演示了,测试方法很简单,在建索引的过程中查询dba_tables表degree列就行了。这里需要强调的一点是对于表的设计规划,前期一定要做好。

五、并行DML无法生效

  1. SQL> explain plan for insert/*+parallel(a,4) */ into emp2 a select * from emp; 
  2.   
  3. Explained. 
  4.   
  5. SQL> select * fromtable(dbms_xplan.display()); 
  6.   
  7. PLAN_TABLE_OUTPUT 
  8. ----------------------------------------------------------------------------------------- 
  9. Plan hash value: 3956160932 
  10.   
  11. --------------------------------------------------------------------------------- 
  12. | Id | Operation              | Name |Rows      | Bytes | Cost (%CPU)| Time  | 
  13. --------------------------------------------------------------------------------- 
  14. |   0| INSERT STATEMENT    |     |    1 |    87 |     2  (0)| 00:00:01 | 
  15. |   1|  LOAD TABLE CONVENTIONAL | EMP2 ||       |           |              | 
  16. |   2|   TABLE ACCESS FULL        | EMP     |     1 |   87 |     2   (0)| 00:00:01 | 
  17. --------------------------------------------------------------------------------- 
  18.   
  19. Note 
  20. ----- 
  21.    -dynamic sampling used for this statement (level=2) 
  22.   
  23. 13 rows selected. 

 

可以看到该DML语句在有HINT提示的情况下没有使用并行,那要怎样才能使它使用并行呢?很简单,只需要执行alter session enable parallel dml; 这里也可以想一下和之前的并行查询和并行DDL是不同的。

  1. SQL> alter session enable parallel dml; 
  2.   
  3. Session altered. 
  4.   
  5. SQL> explain plan for insert/*+parallel(a,4) */ into emp2 a select * from emp; 
  6.   
  7. Explained. 
  8.   
  9. SQL> select * fromtable(dbms_xplan.display()); 
  10.   
  11. PLAN_TABLE_OUTPUT 
  12. -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
  13. Plan hash value: 883381916 
  14.   
  15. ----------------------------------------------------------------------------------------------------------------- 
  16. | Id | Operation             | Name       |Rows  | Bytes | Cost (%CPU)| Time        |          TQ |IN-OUT| PQ Distrib | 
  17. ----------------------------------------------------------------------------------------------------------------- 
  18. |   0| INSERT STATEMENT   |         |           1 |  87 |  2   (0)| 00:00:01 |          |          |                   | 
  19. |   1|  PX COORDINATOR          |          |             |             |                   |         |              |          |                   | 
  20. |   2|   PX SEND QC (RANDOM)         | :TQ10001 |     1 |  87 |   2  (0)| 00:00:01 |  Q1,01 | P->S |QC (RAND)| 
  21. |   3|    LOAD AS SELECT| EMP2        |             |             |                   |         |  Q1,01 | PCWP |             | 
  22. |   4|     PX RECEIVE                 |          |          1 |  87 |  2   (0)| 00:00:01 |  Q1,01 | PCWP |          | 
  23. |   5|      PX SEND ROUND-ROBIN| :TQ10000 |     1 |  87|   2  (0)| 00:00:01 |           | S->P | RND-ROBIN         | 
  24. |   6|       TABLE ACCESS FULL | EMP       |           1 |  87|   2  (0)| 00:00:01 |           |          |                   | 
  25. ----------------------------------------------------------------------------------------------------------------- 
  26.   
  27. Note 
  28. ----- 
  29.    -dynamic sampling used for this statement (level=2) 
  30.   
  31. 17 rows selected. 

 

执行之后很见效,从执行计划重可以很清楚的看到该DML语句利用了并行度。这里使用的的hint的方式提示语句使用并行,若表本身设置了并行度呢?这种情况也是一样的,需要香执行alter session enable parallel dml; DML语句才可以使用到并行。

还有一个情况需要注意的是,对于开启并行度之后的表存在事务未提交的,后续的事务一定会失败,报如下错误:ORA-12838: cannot read/modify an object after modifying it inparallel。

  1. SQL> alter table emp2 parallel 2; 
  2.   
  3. Table altered. 
  4.   
  5. SQL> alter session enable parallel dml; 
  6.   
  7. Session altered. 
  8.   
  9. SQL> insert into emp2 a select * fromemp; 
  10.   
  11. rows created. 
  12.   
  13. SQL> insert into emp2 a select * fromemp; 
  14. insert into emp2 a select * from emp 
  15.            * 
  16. ERROR at line 1: 
  17. ORA-12838: cannot read/modify an objectafter modifying it in parallel 

 

该问题在写存储过程的时候一定要注意,事务及时提交,但这里又涉及到一个性能问题了,所以对于表这些对象的并行度尽量不要开启。

总结:并行确实能带来性能上的提升,效率的提高等,但是凡事都有两面性,滥用并行的话会导致程序争议用,资源过度的消耗,并行是会产生排序的,所以了解清除并行的本质,闲时使用并行,合理规划。 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/229485.html<

(0)
管理的头像管理
上一篇2025-04-18 19:12
下一篇 2025-04-18 19:13

相关推荐

  • 云服务器和云虚拟主机怎么选?云服务器和虚拟主机区别

    云服务器适合业务增长快、需弹性扩展的场景,而云虚拟主机适合预算有限、技术门槛低的小型静态网站或测试环境,二者核心区别在于资源独享性与运维复杂度,核心差异解析:从底层架构到使用体验很多人容易混淆这两者,觉得它们都是“买空间建站”,它们的底层逻辑完全不同,云服务器(ECS)就像是你租了一整栋别墅,水电网络独立,你想……

    2026-06-29
    0
  • 赣州智慧旅游招聘是真的吗?赣州旅游人才招聘信息

    中级岗位(3-5年经验)月薪范围通常在6000-10000元,这类岗位需要独立负责项目模块,如独立运营一个抖音账号,或维护一个景区小程序的功能迭代,具备成功案例的候选人议价能力较强,高级岗位(5年以上经验)月薪范围通常在10000-20000元,部分核心管理岗可达更高,这类人才需要具备战略规划能力,如制定整个景……

    2026-06-29
    0
  • 赣州智能物联网车位锁如何管理?智能车位锁管理系统多少钱

    赣州智能物联网车位锁管理的核心在于通过云端平台实现远程控锁、状态实时监控及自动计费,彻底解决传统车位“被占难管”与“找位难”的痛点,在赣州这样的城市,随着机动车保有量的持续增长,老旧小区、商业综合体以及私人固定车位的资源矛盾日益凸显,传统的机械地锁或简易遥控锁,不仅操作繁琐,更无法实现数据化管理,引入智能物联网……

    2026-06-29
    0
  • 赣州智能消防栓好用吗,智能消防栓多少钱一个

    赣州智能消防栓通过物联网技术实现实时监测与远程报警,能显著降低火灾响应时间并提升城市消防安全管理水平,是目前智慧城市建设中不可或缺的基础设施,赣州智能消防栓的核心价值与应用场景传统消防栓往往存在“看不见、摸不着、用不了”的痛点,在赣州这样地形复杂、老城区与新城区并存的区域,传统设施的管理难度极大,智能消防栓的出……

    2026-06-29
    0
  • 云服务器和物理机到底有啥区别?

    云服务器本质上是虚拟化资源池中的弹性实例,而传统物理服务器是独占的硬件实体,前者胜在弹性与运维便捷,后者强在物理隔离与性能稳定,具体选择取决于业务对成本、扩展性及安全合规的权衡,很多人初次接触服务器时,容易把“云服务器”和“传统物理服务器”混为一谈,觉得它们都是用来跑网站或存数据的盒子,这两者的底层逻辑完全不同……

    2026-06-29
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注