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