作者  刘金龙·沃趣科技高级数据库技术专家

出品  沃趣科技

经过第一篇文章《Oracle 中的并行系列(一)》的介绍,我们对Oracle中的并行有了大致的了解。但是实际使用并行的过程中我们可能会遇到很多问题,比如可能还会遇到数据倾斜 、并行降级、并行失效、分发方式不合理、BUFFER SORT、HASH JOIN BUFFERED阻塞等情况。今天我们介绍其中一个大家很关心的问题:你设置的并行真的生效了吗?

要测试判断并行是否存在问题,我们一般会使用如下排查思路流程:

  • 操作系统硬件资源使用情况。

  • 数据库负载信息:活动会话,并行参数设置限制等

  • 跟踪监控并行SQL。

  • 尝试解决方案再次执行查看并行服务进程使用情况。

模拟问题:数据库中执行简单8个并行查询语句,观察并行是否存在问题。sql_text: select /*+ parallel(8)*/count(*) from test;

1.操作系统硬件资源

执行并行查询语句的时候,关注系统硬件资源的使用情况。如下示例图可知该测试环境有72颗逻辑cpu,并且开启并行查询后cpu使用率在1-2%之间,磁盘的读吞吐大概为3G左右。简单判断系统硬件资源不存在瓶颈,根据经验初步判断并行应该是生效了,因为磁盘吞吐较高,未开并行一般吞吐在几十兆到1G不等(具体视sql语句复杂度和存储类型)。

图1.1

图1.2

2.数据库并行参数配置

在初步确认系统硬件资源充足的情况下,确认数据库并行参数是否做过修改存在限制。

  • cpu_count为72,默认情况下等于操作系统cpu数量。

  • parallel_max_servers为1970,一个实例分配并行执行进程和并行恢复进程的最大数量。受参数(CPU_COUNT, PARALLEL_THREADS_PER_CPU, PGA_AGGREGATE_TARGET)影响,具体可以参数文章(Doc ID 1968840.1)。

  • parallel_min_percent默认为0,并行执行需要并行执行进程数的最小百分比。

  • parallel_min_servers默认为0,实例启动时oracle 常见的初始并行进程数量。

  • parallel_servers_targets为1152,一旦系统上活的并行服务器进程数等于PARALLEL_SERVERS_TARGETS,并行语句将开始排队。

  • parallel_threads_per_cpu默认为2,参数描述并行执行期间每个CPU能处理的并行执行进程或线程数。

图2.1

3.跟踪监控SQL执行

跟踪SQL执行计划,如示例图3.1展示结果:Note Degree of Parallelism is 8 because of hint。执行计划显示该测试语句因为使用了hint,语句执行并行度为8。需要注意的是虽然这里显示了并行度为8,但是真正使用多少并行需要使用其他手段监控,一般我们会使用sql monitor来确定。如示例图3.2和图3.3展示结果:Parallel Execution Details(DOP=4,Servers Requested=8,Servers Allocated=4)。测试语句希望请求8个并行进程但是实际上只申请到了4个并行进程。我们通过查询视图v$px_process_sysstat和v$pq_sysstat也同样可以发现只申请了4个并行进程。

Tip:对于生产环境,一些DML语句我们不能随意执行语句进行测试。这个时候可以根据sql_id使用v$sql或者dba_hist_sqlstat视图进行并行进程使用情况的查看。

图3.1

图3.2

图3.3

图3.4

图3.5

4.定位问题原因

根据前面的查询步骤我们已经发现了问题:sql的并行出现了降级(8>4)。这时我们需要更细粒度的日志监控判断问题原因,sql monitor可能也无法帮助我们定位问题根源。Oracle从9i之后提供了非常强大的跟踪工具,我们可以通过会话中设置“_px_trace”参数完成对并行语句的更细粒度的跟踪。由于本环境为测试环境并且压力负载较小所以使用"_px_trace"=high,all高粒度trace日志打印。根据示例图4.1可以非常清晰的看到以下流程:kxfrcomputerThread request 8 threads>kxfrADjustDOP no,threads 8>kxfrAllocSlaves request 8 threads>kxfpgsg call 8>kxfpiinfo mxslv:1970,inst target:1152(资源充足)>KxFpAdaptDOP Resource Manager reduced num server to maxdop=4。问题非常明显数据库使用Resource Manager导致并行出现了降级。

Tip:并行trace使用参考详细可以参考文章(Doc ID 444164.1):

alter session set "_px_trace"=[[Verbosity,]area],[[Verbosity,]area],..,[time];

alter session set "_px_trace"=high/medium/low,scheduling/granule/messaging/buffer/compilation/all/none,time;

  • scheduling - ( equivalent to some of event 10384 and some of 10390)

  • execution - (equivalent to some of event 10390)

  • granule - (equivalent to some of event 10390 and some of 10391)

  • messaging - (equivalent to event 10392 and event 10393)

  • buffer - (equivalent to event 10399)

  • compilation - ( no equivalent event)

  • all - all of the above

  • none - none of the above.

图4.1

5.验证解决并行降级问题

根据第四部分的trace信息可以定位为Resource Manager引起了并行降级问题。查询当前会话确实有名为CITY_GROUP的资源限制存在,根据示例图5.2显示列PARALLEL_DEGREE_LIMIT_P1并行为4。Resource Manager并行度进行了限制统一为4。解决Resource Manager的问题后再次进行测试。使用sql monitor判断如示例图5.3展示结果:Parallel Execution Details(DOP=8,Servers Allocated=8),并行恢复正常。

图5.1

图5.2

图5.3

一般情况下我们可以通过上述分析流程判断我们的并行是否真的生效或者降级的问题。sql monitor工具和v$px_process_sysstat等视图可以给我们展示语句真正使用的并行度。但是当我们发现并行存在问题的时候,我们可能需要更细粒度的_px_trace工具产生trace日志进行跟踪分析。

| 作者简介

刘金龙·沃趣科技高级数据库技术专家

精通Oracle内部体系结构原理,擅长Oracle数据库性能调优、故障分析、定位以及解决,是国内最先接触并成功搭建测试12c R2 sharding 的DBA之一。

点击查看招聘信息

相关链接

Oracle集群技术 | 集群的自启动系列(一)

深入浅出Kubernetes网络:容器网络初探

SQL优化之统计信息和索引

数据恢复新姿势——通过ibd和frm文件恢复数据

Oracle 中的并行系列(一)

MySQL主从复制错误——列类型转换错误

SQL优化案例-union代替or(九)

sysbench花式采坑之二:自增值导致的主键冲突

MySQL5.7中的sql_mode默认值

复制错误案例分享(二)

MySQL分析函数实现

Pod挂载Volume失败问题分析

更多干货,欢迎来撩~

oracle 判断是否错误_Oracle中的并行系列(二):你设置的并行真的生效了吗?...相关推荐

  1. MySQL与oracle报错显示_Oracle中判断表是否存在再删除表避免报错与MySql和SqlServer的不同...

    不同数据库中drop a table if it exists的不同: In MySQL it is pretty easy to drop a table if it exists already. ...

  2. oracle的clob赋值_Oracle中Clob类型处理解析 (转)

    最近利用NHibernate映射类型为Clob字段在插入数据时发现当字符的字节数(一个半角字符一个字节,一个全角字符两个字节)在2000-4000之间时报错(ORA-01461:仅可以插入LONG列的 ...

  3. oracle判断单数双数,代码中你所不知道的偶数与奇数的判断方法

    数学上的定义:所有整数不是奇数(单数),就是偶数(双数).若某数是2的倍数,它就是偶数(双数),可表示为2n:若非,它就是奇数(单数),可表示为2n+1(n为整数),即奇数(单数)除以二的余数是一.除 ...

  4. oracle 大于当天时间_oracle中时间格式时候的大于号是大于和等于的意思

    redis lua 需求是在缓存最近一周内用户所有消息列表,考虑用Redis 存储:为每个存储一个独立Sorted Set,value 为消息体,Score 为MessageId,用以实现增量消息同步 ...

  5. oracle存储过程无效字符_Oracle中无效存储过程的重新编译方法

    在SQL_PLUS中: spool ExecCompProc.sql select 'alter procedure '||object_name||' compile;' From all_obje ...

  6. oracle判断为周一_oracle根据四位年周取当周周一的日期函数

    create or replace function FUNC_GET_DATE_BY_WEEK ( theYearWeek IN VARCHAR2 ) return date is normalDa ...

  7. oracle转成整型_Oracle中如何用SQL把字符串转换成整型

    展开全部 首先,字符串必须是数字形式的字符串,32313133353236313431303231363533e58685e5aeb931333365663530如"12345"或 ...

  8. oracle判断为周一_oracle sql技巧:取上周一到上周日(本周一到本周日\下周一到下周日)的时间...

    /** * * @param anObject:  thisWeek=本周:nextWeek=下周 * @return monday */ public String getMonday(String ...

  9. oracle转成整型_Oracle中如何用SQL把字符串转换成整型 ?

    您可以使用cast函数将数字字符串转化为整型. cast函数格式如下: CAST(字段名 as int); 拓展资料 结构化查询语言(Structured Query Language)简称SQL(发 ...

最新文章

  1. iOS 9应用开发教程之ios9中实现按钮的响应
  2. CodeForces - 556A Case of the Zeros and Ones
  3. Phoenix:全局索引设计实践
  4. 信息学奥赛C++语言:百钱买百鸡
  5. 增加一行减少一行_【第2171期】一行 CSS 代码的魅力
  6. 打开的文件过多问题排查思路及解决过程
  7. 云星数据VP楼炜:CMP是混合云、多云管理的必然选择
  8. 怎么修改html后缀名,在win7系统下如何修改文件后缀名?win7修改文件后缀名html方法...
  9. 转发文章【我们是怎样一步步的走向平庸的】
  10. Tab页的两种写法 - jeesite记录
  11. tomcat的下载和启动
  12. 如何写一篇可实施的技术方案?
  13. linux传奇私服文件包,传奇私服服务器端文件结构
  14. 安卓手机测评_2018最全安卓模拟器跑分测评
  15. 【dubbo-2.5.x】Linux下dubbo-admin监控/管理平台部署详细教程
  16. 几种视频格式(RMVB,FLV,MP4,AVI等等)区别比较
  17. Docker 4 之 Docker 客户端和守护进程
  18. dubbo源码分析25 -- 序列化与反序列化
  19. 计算机控制技术注册二建,中央空调系统运行培训
  20. www.wolframalpha.com

热门文章

  1. RNA-seq分析流程
  2. 用计算机弹奏lemon乐谱,原神乐谱lemon怎么弹 lemon乐谱弹奏方法教学
  3. STM32最小系统电路
  4. java whois_Java如何实现简单的whois查询
  5. 衡量微型计算机的性能指标参数有哪些,衡量计算机性能的主要技术指标有哪些?...
  6. Pandas中 DateFrame 修改列名
  7. Python-anaconda-Spyder使用matplotlib画图无法显示报错解决:Figures now render in the Plots pane by default. To mak
  8. zip压缩报错解决:zip warning: name not matched: xxx/xxx/xxx
  9. 对服务器文件夹写,服务器文件夹写入权限设置
  10. php自定义函数出现乱码,php的imagettftext 函数出现乱码的解决方法