血案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;
以下是执行结果: