
导读
我们在创建Oracle的数据表时,有时会不经意的采用parallel方式创建,特别是我们在创建一些分区表或者采用CTAS方式创建时;有时也会因为对Oracle并行机制了解不是很清楚,人为直接在表级开启了parallel而未指定并行数。这两种方式就会导致数据表在表级采用了DEFAULT级别的并行度,而表级别的并行度是全局的,大量的会话就会导致大量并行产生,从而影响数据库的性能。这个问题的本质是直接在表级别设置并行度,对于OLTP的应用来说通常是不恰当的。
解决这个问题的办法就是不要人为显式或隐式设置表级别的并行度,或者说表级别的并行度应该要设置为1。
以下记录了一个真实案例的完整分析过程:
并行引起的灾祸
常见原因一般有以下两个
1、对象开启了并行(包括索引和表)
2、SQL语句里面使用了PARALLEL的HINTS
现场兄弟把查询结果一一截图给我

层层推进,分析问题

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


找到mos上关于该参数的相关信息,是一个默认并行度的参数,该参数值的算法如下:
DEFAULT DOP = cpu_count * parallel_threads_per_cpu* cluster_database_instances
在得到现场兄弟肯定的答复后
至此问题明朗起来了!
执行的SQL使用了默认并行度执行,受参数parallel_query_default_dop控制。既然是默认的并行度,那也应该需要设置(如果不设置,默认是1)。于是我把前期的查询验证对象并行度是否开启的SQL改造了下,具体如下:


问题解决
据上图明显有一个设置了并行度为DEFAULT(如果我们不设置就是1)的表和索引,只需要取消默认并行度即可,即执行如下SQL:
--针对表
alter table table_name noparallel;
--针对索引
Alter index index_name noparallel;
现场兄弟把对象并行度修改为1,再次执行该SQL。发现并行消失了,数据库恢复了正常。
如何设置并行度为default
通过实践发现如下2种方式可以实现并行度设置为DEFAULT。
1、创建表的时候指定

2、创建表之后可以修改

以上
就是本期的微课堂内容
如果你在工作中也有些小发现、小心得
欢迎来稿
family@longshine.com
小编相信总有一天等到你
只有不断学习,
才能看到遥远的未来。
——《学习开创未来》

