大数跨境
0
0

微课堂|一次SQL并行执行怎么产生的分析

微课堂|一次SQL并行执行怎么产生的分析 朗新Family
2018-11-22
4

导读


我们在创建Oracle的数据表时,有时会不经意的采用parallel方式创建,特别是我们在创建一些分区表或者采用CTAS方式创建时;有时也会因为对Oracle并行机制了解不是很清楚,人为直接在表级开启了parallel而未指定并行数。这两种方式就会导致数据表在表级采用了DEFAULT级别的并行度,而表级别的并行度是全局的,大量的会话就会导致大量并行产生,从而影响数据库的性能。这个问题的本质是直接在表级别设置并行度,对于OLTP的应用来说通常是不恰当的。


解决这个问题的办法就是不要人为显式或隐式设置表级别的并行度,或者说表级别的并行度应该要设置为1。


以下记录了一个真实案例的完整分析过程:


并行引起的灾祸


大兄弟,

数据库会话执行的SQL开启了并行,

导致负载很高,会话也高,

查了半天,没找到具体原因,

怎么办怎么办?


常见原因一般有以下两个

1、对象开启了并行(包括索引和表)

2、SQL语句里面使用了PARALLEL的HINTS


“报告 !

都查了并没有上面的情况”


没有设置并行度,也没有加HINTS,执行的SQL怎么会并行执行呢?

现场兄弟把查询结果一一截图给我


层层推进,分析问题



是不是参数控制了?

没有发现可疑参数。至此,表面排查的结果已经解决不了这个问题了,于是找现场兄弟找了一条正在并行的SQL ,手动执行,并收集一个10053事件trace,看看是否能有新发现。脚本如下:



大兄弟,我再发个TRACE FILE文件给你看看能否发现问题



发现可疑参数:parallel_query_default_dop  = 16

找到mos上关于该参数的相关信息,是一个默认并行度的参数,该参数值的算法如下:

DEFAULT DOP = cpu_count * parallel_threads_per_cpu* cluster_database_instances


兄弟,执行的SQL在活动会话中体现的是不是16个并行进程?

在得到现场兄弟肯定的答复后

至此问题明朗起来了!

执行的SQL使用了默认并行度执行,受参数parallel_query_default_dop控制。既然是默认的并行度,那也应该需要设置(如果不设置,默认是1)。于是我把前期的查询验证对象并行度是否开启的SQL改造了下,具体如下:


问题解决


据上图明显有一个设置了并行度为DEFAULT(如果我们不设置就是1)的表和索引,只需要取消默认并行度即可,即执行如下SQL:

--针对表

alter table table_name noparallel;

--针对索引

Alter index index_name noparallel;

现场兄弟把对象并行度修改为1,再次执行该SQL。发现并行消失了,数据库恢复了正常。


问题虽解决,但正常创建索引和表都是1。什么情况下会设置的并行度为DEFUALT呢?

如何设置并行度为default

通过实践发现如下2种方式可以实现并行度设置为DEFAULT。

1、创建表的时候指定


2、创建表之后可以修改


以上

就是本期的微课堂内容

如果你在工作中也有些小发现、小心得

欢迎来稿

family@longshine.com

小编相信总有一天等到你


只有不断学习,

才能看到遥远的未来。

——《学习开创未来》



【声明】内容源于网络
0
0
朗新Family
朗新企业文化、学习发展、内部沟通官方公众平台
内容 1141
粉丝 0
朗新Family 朗新企业文化、学习发展、内部沟通官方公众平台
总阅读1.3k
粉丝0
内容1.1k