事件背景
某駐場客戶上線oa系統(tǒng),上線后系統(tǒng)負載很高,經客戶溝通對top sql進行調優(yōu)處理,大部分SQL索引創(chuàng)建不合理,少部分需要進行改寫調優(yōu),摘取其中一個比較典型sql進行描述。
調優(yōu)過程
原SQL:
select count(*)
from xxxx.xxxxx_table_name
WHERE ID not IN (SELECT MIN(ID)
from xxxx.xxxxx_table_name
group by resourceid,
resourcetype,
infoid,
menutype,
sharetype,
sharevalue,
seclevel,
rolelevel,
customid,
jobtitlelevel,
jobtitlesharevalue);
COUNT(*)
----------
10291
執(zhí)行計劃如下, xxxx.xxxxx_table_name表被驅動執(zhí)行了22341次。
從上述執(zhí)行計劃可以了解到的信息是id 3,xxxx.xxxxx_table_name表全表掃描返回22341行數據,執(zhí)行時間0.01s,對子查詢進行匹配,子查詢被掃描了22341次。該步驟為SQL執(zhí)行主要消耗點。而not in可以被等價改寫成left join。
改寫調優(yōu)方案一:
改寫后SQL如下,反連接使用left join進行改寫。
這里的改寫思路是兩個表直接關聯(lián)查詢,從而避免filter過濾導致子查詢被掃描22341次,而是僅僅掃描兩次表就返回想要的結果。
select count(*)
from xxxx.xxxxx_table_name a,
(SELECT MIN(ID) id
from xxxx.xxxxx_table_name
group by resourceid,
resourcetype,
infoid,
menutype,
sharetype,
sharevalue,
seclevel,
rolelevel,
customid,
jobtitlelevel,
jobtitlesharevalue) b
where a.id = b.id(+)
and b.id is null;
COUNT(*)
----------
10291
改寫調優(yōu)方案二:
上述子查詢因有min函數,且不包含這個最小值,姑可以查詢滿足比這個最小值要大,因此可以使用分析函數進行改寫,可以進一步減少一次全表掃描,性能達到最優(yōu),改寫后的SQL以及執(zhí)行計劃如下:
select count(*)
from (select row_number() over(partition by resourceid, resourcetype, infoid, menutype, sharetype, sharevalue, seclevel, rolelevel, customid, jobtitlelevel, jobtitlesharevalue order by id asc) rn
from xxxx.xxxxx_table_name)
where rn > 1;
COUNT(*)
----------
10291
分析總結
SQL執(zhí)行效率差,影響正常生產業(yè)務是數據庫運維人員經常遇到的場景,SQL的寫法很重要,很多系統(tǒng)隨著數據量的增長越來越慢,大部分跟SQL寫法不佳有關,如果我們運維人員不能識別這些低效寫法,就會背上運維水平差的鍋,影響運維公司形象。
在我們調優(yōu)過程中,換個思路,可能會得到不一樣的結果,通過以上兩種調優(yōu)思路希望能幫助到大家。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/129573.html
摘要:最近遇見一個的慢查問題,于是排查了下,這里把相關的過程做個總結。而且,我檢查了子查詢的表的索引,中用到的查詢條件都已經增加了索引。還好我們的子查詢加了必要的索引,不然結果會更加慘不忍睹。這個結果真是太坑爹,而且十分違反直覺。 最近遇見一個 MySQL 的慢查問題,于是排查了下,這里把相關的過程做個總結。 定位原因 我首先查看了 MySQL 的慢查詢日志,發(fā)現(xiàn)有這樣一條 query 耗時...
摘要:實現(xiàn)事務的原子性,要支持回滾操作,在某個操作失敗后,回滾到事務執(zhí)行之前的狀態(tài)。一致性事務使得系統(tǒng)從一個一致的狀態(tài)轉換到另一個一致狀態(tài)。 本文作者 TomorrowWu,原創(chuàng)文章,轉載注明出處,博客地址 https://segmentfault.com/u/to... 第一時間看后續(xù)精彩文章。覺得好的話,順手分享到朋友圈吧,感謝支持。 筆者最近在準備面試,覺得學習最好的方式就是把知道的東...
閱讀 1356·2023-01-11 13:20
閱讀 1707·2023-01-11 13:20
閱讀 1215·2023-01-11 13:20
閱讀 1906·2023-01-11 13:20
閱讀 4165·2023-01-11 13:20
閱讀 2757·2023-01-11 13:20
閱讀 1402·2023-01-11 13:20
閱讀 3671·2023-01-11 13:20