oracle使用并行踩过的坑

https://blog.51cto.com/wyzwl/1948035

一、并行机制的简述

并行处理的机制实际上就是把一个要扫描的数据集分成很多小数据集,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对并行处理的执行计划的解读。

SQL>create table emp2 as select * from scott.emp;
 
SQL>alter table emp2 parallel 2;  --可以查看dba_tables表degree列
 
SQL>explain plan for select sum(sal) from emp2 group by deptno;
 
SQL> select * from table(dbms_xplan.display());
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 3939201228
 
------------------------------------------------------------------------------------------------------------------
| Id | Operation              |Name     | Rows  | Bytes | Cost (%CPU)| Time     |        TQ  |IN-OUT| PQ Distrib |
------------------------------------------------------------------------------------------------------------------
|   0| SELECT STATEMENT    |         |         1|          26 |           2   (0)| 00:00:01 |          |         |                  |
|   1|  PX COORDINATOR           |         |          |           |                 |        |            |         |                 |
|   2|   PX SEND QC (RANDOM)          | :TQ10001 |  1 |          26 |           2  (0)| 00:00:01 |  Q1,01 | P->S |QC (RAND)  |
|   3|    HASH GROUP BY |         |         1 |         26 |           2  (0)| 00:00:01 |  Q1,01 | PCWP |                  |
|   4|     PX RECEIVE                  |         |         1 |         26 |           2  (0)| 00:00:01 |  Q1,01 | PCWP |                  |
|   5|      PX SEND HASH          | :TQ10000 |  1 |          26 |           2  (0)| 00:00:01 |  Q1,00 | P->P |HASH          |
|   6|       HASH GROUP BY    |         |         1 |         26 |           2  (0)| 00:00:01 |  Q1,00 | PCWP |                  |
|   7|        PX BLOCK ITERATOR |             |         1 |         26 |           2  (0)| 00:00:01 |  Q1,00 | PCWC |                  
上一篇:手把手教你看MySQL官方文档


下一篇:《容器化系列三》利用Docker创建两个apache容器并单独提供ip能直接访问