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;

以下是执行结果:

猜你喜欢

转载自blog.csdn.net/lanxuxml/article/details/103575539