使用mod对数据进行进行分组解决TEMP表空间不足的问题

一个统计SQL,消耗了100G TEMP报错。

SELECT /*+ parallel(a,10) parallel(b,10) parallel(c,10) use_hash(a,b,c) */*
  from TU_INT.I_PRD_OFFER_MEMBER_1 partition(p13) a,
       tu_model.tb_prd_offer_inst_280 partition(p2) b,
       TU_MODEL.TB_PRD_OFFER_ROLES c
 where a.OFFER_ID = b.SRC_OFFER_INST_ID
  and a.OFFER_ROLE_ID=c.OFFER_ROLE_ID(+);

主机空闲内存严重不足,尝试了手工设置HASH区,一共分了7G PGA还是不行,不敢在分多。NESTED LOOP的速度客户无法接受

于是想到了对数据进行分组

SELECT /*+ parallel(a,10) parallel(b,10) parallel(c,10) use_hash(a,b,c) */*
  from TU_INT.I_PRD_OFFER_MEMBER_1 partition(p13) a,
       tu_model.tb_prd_offer_inst_280 partition(p2) b,
       TU_MODEL.TB_PRD_OFFER_ROLES c
 where a.OFFER_ID = b.SRC_OFFER_INST_ID
  AND MOD(a.OFFER_ID,10)=0
  AND MOD(b.SRC_OFFER_INST_ID,10)=0
  and a.OFFER_ROLE_ID=c.OFFER_ROLE_ID(+);

进行分组后,基本上TEMP消耗在20G左右,可以跑出来数据。
客户可以接受

不过这个SQL挺奇怪的,对于1个17G的表和1个30多G的表HASH,在和一个20M的表做外连接,按照测试竟然需要200G以上的TEMP。感觉9I无法进行hash right outer join有关。有空在研究

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8242091/viewspace-751981/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8242091/viewspace-751981/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值