iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >oracle使用并行踩过的坑
  • 308
分享到

oracle使用并行踩过的坑

2024-04-02 19:04:59 308人浏览 薄情痞子
摘要

一、并行机制的简述并行处理的机制实际上就是把一个要扫描的数据集分成很多小数据集,oracle会根据初始化参数 PARALLEL_MIN_SERVERS=n的值启动几个并行服务进程同时处理这些小数据集,最后将

一、并行机制的简述

并行处理的机制实际上就是把一个要扫描的数据集分成很多小数据集,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 into t select * 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>createtable emp2 as select * from scott.emp;
 
SQL>altertable emp2 parallel 2;  --可以查看dba_tables表degree列
 
SQL>explainplan for select sum(sal) from emp2 group by deptno;
 
SQL> select * fromtable(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 |                  |
|   8|   TABLE ACCESS FULL| EMP2     |  1 |         26 |           2  (0)| 00:00:01 |  Q1,00 | PCWP |                  |
------------------------------------------------------------------------------------------------------------------
 
Note
-----
   -dynamic sampling used for this statement (level=2)
 
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无法生效

SQL> explain plan for insert into emp2 a select * from emp;
 
Explained.
 
SQL> select * fromtable(dbms_xplan.display());
 
PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------
Plan hash value: 3956160932
 
---------------------------------------------------------------------------------
| Id | Operation              | Name |Rows      | Bytes | Cost (%CPU)| Time  |
---------------------------------------------------------------------------------
|   0| INSERT STATEMENT    |     |    1 |    87 |     2  (0)| 00:00:01 |
|   1|  LOAD TABLE CONVENTIONAL | EMP2 ||       |           |              |
|   2|   TABLE ACCESS FULL        | EMP     |     1 |   87 |     2   (0)| 00:00:01 |
---------------------------------------------------------------------------------
 
Note
-----
   -dynamic sampling used for this statement (level=2)
 
13 rows selected.

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

SQL> alter session enable parallel dml;
 
Session altered.
 
SQL> explain plan for insert into emp2 a select * from emp;
 
Explained.
 
SQL> select * fromtable(dbms_xplan.display());
 
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 883381916
 
-----------------------------------------------------------------------------------------------------------------
| Id | Operation             | Name       |Rows  | Bytes | Cost (%CPU)| Time        |          TQ |IN-OUT| PQ Distrib |
-----------------------------------------------------------------------------------------------------------------
|   0| INSERT STATEMENT   |         |           1 |  87 |  2   (0)| 00:00:01 |          |          |                   |
|   1|  PX COORDINATOR          |          |             |             |                   |         |              |          |                   |
|   2|   PX SEND QC (RANDOM)         | :TQ10001 |     1 |  87 |   2  (0)| 00:00:01 |  Q1,01 | P->S |QC (RAND)|
|   3|    LOAD AS SELECT| EMP2        |             |             |                   |         |  Q1,01 | PCWP |             |
|   4|     PX RECEIVE                 |          |          1 |  87 |  2   (0)| 00:00:01 |  Q1,01 | PCWP |          |
|   5|      PX SEND ROUND-ROBIN| :TQ10000 |     1 |  87|   2  (0)| 00:00:01 |           | S->P | RND-ROBIN         |
|   6|       TABLE ACCESS FULL | EMP       |           1 |  87|   2  (0)| 00:00:01 |           |          |                   |
-----------------------------------------------------------------------------------------------------------------
 
Note
-----
   -dynamic sampling used for this statement (level=2)
 
17 rows selected.

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

 

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

SQL> alter table emp2 parallel 2;
 
Table altered.
 
SQL> alter session enable parallel dml;
 
Session altered.
 
SQL> insert into emp2 a select * fromemp;
 
0 rows created.
 
SQL> insert into emp2 a select * fromemp;
insert into emp2 a select * from emp
           *
ERROR at line 1:
ORA-12838: cannot read/modify an objectafter modifying it in parallel

 

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

 

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




您可能感兴趣的文档:

--结束END--

本文标题: oracle使用并行踩过的坑

本文链接: https://www.lsjlt.com/news/37909.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • golang http使用踩过的坑与填坑指南
    golang对http进行了很好的封装, 使我们在开发基于http服务的时候, 十分的方便, 但是良好的封装, 很容易是的我们忽略掉它们底层的实现细节。 如下是我踩过的一些坑, 以及...
    99+
    2024-04-02
  • VUE使用中踩过的坑有哪些
    小编给大家分享一下VUE使用中踩过的坑有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.路由变化页面数据不刷新问题出现这种...
    99+
    2024-04-02
  • jpa使用manyToOne(opntional=true)踩过的坑及解决
    目录jpa使用manyToOne(opntional=true)踩坑@ManyToOne用于一对多的情况@manytoone设置为optional=true不起作用@manytoon...
    99+
    2024-04-02
  • SpringRestTemplate的使用与踩坑
    目录引言项目使用踩坑记录引言 最近的项目需求中有使用到后端发送http请求,在网上寻找资料后发现可以使用spring自带的RestTemplate类实现,故作此记录 项目使用 将下述...
    99+
    2023-02-10
    Spring RestTemplate Spring RestTemplate基本使用
  • 解决Django transaction进行事务管理踩过的坑
    概要 Transaction是django进行数据库原子性操作在python层面上的实现。 简单来说, 被transaction.atomic()包裹的代码块只在代码块顺利完成后进行...
    99+
    2024-04-02
  • Linux高并发踩过的坑及性能实例分析
    这篇文章主要讲解了“Linux高并发踩过的坑及性能实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux高并发踩过的坑及性能实例分析”吧!前言Linux操作系统是现在服务器的首选操...
    99+
    2023-06-22
  • vue使用Swiper踩坑解决避坑
    目录我的Swiper定义:报错信息:保留默认名class:swiper-container查看GitHub我的Swiper定义: Failed to execute 'get...
    99+
    2023-05-20
    vue Swiper踩坑解决 vue Swiper避坑
  • 关于python的mediapipe库踩过的坑
      大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页:lqj_本人的博客_CSDN博客-微信小程序,前端,vue领域博主lqj_本人擅长微信小程序,前端,vue,等方面的知识https://blog.csdn.net/l...
    99+
    2023-09-06
    python pycharm 开发语言
  • 记一次go语言使用time.Duration类型踩过的坑
    目录01 踩到的坑02 time.Duration的真实面目03 问题解决04 time.Duration编程实践05 总结01 踩到的坑 先来说说在项目中踩到的使用time.Dur...
    99+
    2024-04-02
  • 如何解决Go gorm踩过的坑
    这篇文章给大家分享的是有关如何解决Go gorm踩过的坑的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是gogo是golang的简称,golang 是Google开发的一种静态强类型、编译型、并发型,并具有垃...
    99+
    2023-06-14
  • 解决spring集成redisson踩过的坑
    目录spring集成redisson踩过的坑第一坑就是版本兼容问题第二个坑是设置密码问题spring整合redisson配置配置方式单节点配置standalone哨兵配置sentin...
    99+
    2024-04-02
  • java使用BeanUtils.copyProperties踩坑经历
    目录1. 原始转换2. 使用BeanUtils.copyProperties转换3. 踩坑经历3.1 包装类型转基本类型问题3.2 空格问题3.3 查找不到字段引用3.4 前端误传字...
    99+
    2024-04-02
  • 使用Pytorch 2.0训练踩坑
    概述 最近博主在跑一个实验,但它在Pytorch 1.8版本下感觉有点慢,刚好又看到Pytorch 2.0版本加速很多,所以准备用Pytorch 2.0版本运行代码。在这个过程中,出现了一些小问题,还...
    99+
    2023-09-22
    pytorch 深度学习 python
  • vue使用element-ui按需引入时踩过的那些坑
    众所周知,使用element-ui,为了达到减小项目体积的目的 ,我们在实际项目中更多的是采用按需引入的方法, 下面就来讲讲那些我踩过的坑。 步骤: 第一步:安装 element-u...
    99+
    2024-04-02
  • 记一次使用nacos2踩到的坑
    前言 本文素材来源朋友学习nacos2.1.1踩到的坑。直接上正菜 坑点一:出现端口被占用 因为是学习使用,朋友就在物理机搭建了搭建了nacos伪集群,即ip都一样,端口分别为8848,8847,88...
    99+
    2023-09-17
    nginx 服务器 运维 springcloud
  • 解决spring boot2集成activiti6踩过的坑
    spring boot2集成activiti6踩过的坑 1.activiti中的mybaitis版本冲突 错误信息 Caused by: java.lang.NoSuchField...
    99+
    2024-04-02
  • 基于函数执行的踩坑(addEventListener)
    目录记录一次踩坑经历写法一写法二.addEventListener添加事件失败原因之一正确语法错误语法总结记录一次踩坑经历 写法一 const outer = function ()...
    99+
    2023-01-28
    函数执行的踩坑 addEventListener 函数执行addEventListener
  • 那些年踩过的Dubbo坑有哪些
    那些年踩过的Dubbo坑有哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言微服务架构在如今的9102年已经不是什么新鲜的话题了,但是怎么做好微服务架构,却又是一个永恒...
    99+
    2023-06-19
  • 在uni-app中踩过的坑及解决
    目录1. props传值变量名不要使用id2.组件没有页面事件3.关于背景图片4.代理5.z-index的问题6.trim去除前后空格失效总结1. props传值变量名不要使用id ...
    99+
    2023-05-16
    uni-app踩过的坑 uni-app踩坑 uni-app的坑
  • 解决Pytorch中Batch Normalization layer踩过的坑
    1. 注意momentum的定义 Pytorch中的BN层的动量平滑和常见的动量法计算方式是相反的,默认的momentum=0.1 BN层里的表达式为: 其中γ和β是可以学习的参...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作