当Parallel DML遇到分布式事务、分区表和LOB时

今天遇到一个问题,某sql的并发度虽然已经全部获得但是只有少数几个slave干活。

insert要求有16个并发,虽然在v$PX_SESSION看到其获得的degree是16,但是并不是这16个slave都在干活,从sqlmonitor里面看,16个并发子进程只有4个在干活,有消耗cpu time,有buffer get,有read reqs或write reqs。在v$session中也能看到这16个session,但是只有4个session是active的状态,其他都是inactive的。(虽然一开始16个都是active)

为什么其他的子进程不干活呢?

干活的子进程的数量,好像还和通过where条件选出来的分区有关系。如果where条件选出来的只有4个分区,那么干活的子进程只有4个。如果where条件选出来的分区只有3个,那么就只有3个slave会干活。但是他们都能获得16个并发子进程,只是并不是所有的子进程都干活。

通过分析发现,并发量只能用到涉及到的分区数,是因为表中包含lob字段。

(1) 并发dml不能用在分布式事物中,oracle的在线文档中可以看到
Distributed Transaction Restrictions:

(2) 但上面的文档描述的是普通表,对分区表来说,还是可以用到并发。并发度为在hint中指定的parallel的值。一开始是会各个子进程处于direct path write temp,在最后阶段汇总并发子进程的信息第时候,子进程会处于较多的enq: HV – contention等待。观测其sqlmonitor的记录,可以看到用到了16个并发度,每个并发度都有CPU、buffer、IO的消耗。

(3) 目前的分区数没有到达hint中的parallel数,这是因为该表中含有lob字段。
如果测试新建一个类似的分区表,只是不包含blob字段信息,做insert时即可拥有hint中指定的parallel数。
在12c之前,有lob字段的分区表是可以有parallel dml,但是intra-partition是不支持并行的,即分区内部是不支持并行的,因此有几个分区你就能看到几个并行。
在12c之后,应该可以支持有LOB字段的分区表的initra-partition。也就是你可以看到多余分区数的并行了。
我们可以在oracle的在线文档中提到:
Restrictions on Parallel DML:

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据