Oracle中一條sql引發的血案(一)

2021-10-01 12:39:10 字數 1392 閱讀 8948

血案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 ***x.yw_wg_17 nologging as 

select /*+parallel(40)*/ a.acc from ***x.yw_wc_cust_1715 a

where not exists ( select /*+parallel(40)*/ 'x' from ***x.yw_wc_cust_17 b where a.acc=b.acc)

group by a.acc;

以下是執行結果:

MySQL中一條SQL語句的執行過程

查詢語句的執行順序 客戶端通過tcp連線傳送連線請求到mysql聯結器,聯結器會對該請求進行許可權驗證及連線資源分配 max connections,8小時超時 建立連線後客戶端傳送一條語句,mysql收到該語句後,通過命令分發器判斷其是否是一條select語句,如果是,在開啟查詢快取的情況下,先在...

mysql中,一條查詢sql的執行過程

作為乙個程式設計師,最不能避免的就是與sql打交道,那麼,在我們平時寫的那麼多sql它們是怎麼執行,並給我們返回資料的?比如最簡單的乙個查詢 select from user where id 10 sql簡單,但問題是你知道它是如何執行的嗎?先從整體看一下mysql資料庫的執行構造 1 serve...

一條clickhouse SQL語句引發的問題思考

前段時間在實際工作中,使用者的一條sql引發了我一些思考。寫一篇簡單的博文來記錄下。實際表的列名等已替換。select from db1.table1 as t1 left join db2.table2 as t2 on t1.col1 t2.col2 where t1.time 2020 01 ...