Oracle中一条sql引发的血案(一)

血案sql如下:

create table yw_wg_17 as 
select distinct ACC from yw_wc_cust_1715 a 
where a.acc not in (select distinct acc from yw_wc_cust_17 b where a.acc=b.acc) 

table YW_WC_CUST_1715:

    Size    1.38 GB

    NUM_ROWS    9,690,487

    Index  none


table  YW_WC_CUST_17:

    Size    11.4 GB

    NUM_ROWS    82,409,451

    Index  none

血案现场:该sql的执行导致磁阵20块硬盘满负荷跑了十几个小时没跑完,监控软件biubiubiu的推送告警信息推送了一夜(没有root权限,所以放着没管)。

 

第二天上班,问同事找来root权限,iotop -p,好家伙,两个进程就几乎把磁阵的IO都耗光了,一看,我了乖乖全是Oracle的,赶紧根据PID查sql,一查,如上,两条几乎一样的sql在建表。

--通过系统PID查询oracle中对应的sql语句

Select s.Sid, s.Status, q.Sql_Text
From V$session s, V$sqltext q
Where s.Sql_Hash_Value = q.Hash_Value And s.Sql_Address = q.Address And
  s.Sid In (Select s.Sid From V$session s, V$process p Where s.Paddr = p.Addr And  p.Spid = '&pid' )
Order By q.Piece;

二话不说,优化sql,杀进程,跑优化后的sql,叮~~~两分钟不到搞定,嗯,烧水泡茶。

以下是优化后的sql:

create /*+ parallel(40) */ table xxxx.yw_wg_17 nologging as 
select /*+PARALLEL(40)*/ a.ACC from xxxx.yw_wc_cust_1715 a 
where NOT EXISTS ( select /*+PARALLEL(40)*/ 'X' from xxxx.yw_wc_cust_17 b where a.acc=b.acc) 
group by a.ACC;

以下是执行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值