Oracle并行基础二

Oracle并行基础(连载二)

作者:沃趣科技高级数据库技术专家 魏兴华



消费者生产者模型的限制

根据上面的介绍,你已经知道了,一个并行操作内一般会具有两组PX slave进程,一组为生产者,一组为消费者。生产者通过table queue发送数据,消费者通过table queue接收数据。而且对于消费者和生产者模型,有一个很大的限制是:一组DFO单元最多只能有两组PX slave进程,之所以有这个限制,一方面可能是Oracle公司为了保持并行代码的简洁性,一方面由于每个PX slave进程之间和每个PX slave与QC之间都要维持一个通信通道(table queue)用于传递消息和数据,如果允许的PX slave有太多组,可能会导致通信通道指数级增长。例如一个DOP为5的并行操作,PX slave之间需要的通道数为55,PX slave与QC之间的通道数为25,共需要(5+2)5=35个通道。可想而知,如果Oracle允许一个并行操作内有3组PX slave,需要维持的连接数有多少,我们假设当前服务器共运行了50个并行,那么三组PX slave进程产生的通道数为5050*50=125000个,还不包括PX slave与QC之间的通道,吓尿了不?

parallel_execution_message_size

如果进程之间传递消息的通道数多但不占用数据库资源可能也并不是什么大的问题,但是事实不是这样的,进程之间传递消息的通道的内存占用大小是由参数parallel_execution_message_size控制的,在11GR2版本这个参数的值为16K,在以前的各个版本这个参数的值可能大小并不一样(每个版本都有增大的趋势),在非RAC环境下,每个通道的大小最大可以为3parallel_execution_message_size,在RAC环境下,每个通道的大小最大可以为4parallel_execution_message_size。
例如一个DOP为20的查询,非rac环境下通道所占用的内存最大可能为:
PX进程的通道内存+QC、PX进程之间的通道内存=202016K3+22016K3=21120K,接近21M的内存。
通道的内存默认是在large pool中分配,如果没有配置large pool则在shared pool中分配。
计算通道内存的公式:
单节点
(NN+2N)316k
RAC节点
(NN+2N)416k

hash join buffered

其实不是hash join的缺陷。
我们已经介绍过生产者消费者模型,它有一个很大“缺陷”是,一个并行操作内,最多只能有2组PX slave,2组PX slave通过table queue来传递消息和交互数据,因此在一组SLAVE在读table queue的时候,不能同时去写另一个table queue。是不是不太好理解?
我们通过一个例子来进行描述:

select /*+ parallel(6) pq_distribute(b hash hash)*/ * from hash_t3 a ,hash_t1 b where a.id=b.id;


  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值