作者:黃浩
一、案例
這一天,I項(xiàng)目組的一個(gè)迭代版本需要上線,這是一個(gè)大版本,需要全員現(xiàn)場(chǎng)支撐,并要求上線后三天待命。
1、不速之客,來(lái)者不善
而就在上線前兩天,即9月24日下午4點(diǎn)鐘,一直以來(lái)波瀾不驚有驚無(wú)險(xiǎn)的性能優(yōu)化,突然被放了一個(gè)大招,某個(gè)頁(yè)面被測(cè)出了嚴(yán)重的性能問(wèn)題,大致情況如下:
瞬間,大家都緊張起來(lái)了。
由于0926版本是公司級(jí)的大版本,不光是I項(xiàng)目組發(fā)布版本,H公司的其它系統(tǒng)也會(huì)同時(shí)發(fā)布版本。為了控制風(fēng)險(xiǎn),會(huì)提前兩天凍結(jié)代碼。按照“不帶BUG上生產(chǎn)”的原則,我們必須要在版本凍結(jié)截至?xí)r(9月24日18點(diǎn)準(zhǔn))“斃”掉這個(gè)性能BUG單。而距離18點(diǎn)還不到2個(gè)小時(shí)。
PM在得知這一消息后也高度關(guān)注,責(zé)令優(yōu)化小組全力攻關(guān),要人給人。這樣,組長(zhǎng)、模塊SE及我就組成了臨時(shí)應(yīng)急小組。大家全力以赴,很快就把問(wèn)題梳理出來(lái)了,大致如下:
該頁(yè)面加載共需要執(zhí)行8條SQL,單條SQL的執(zhí)行都不長(zhǎng),都在性能指標(biāo)范圍內(nèi),但是加起來(lái)超過(guò)了5s;剩下的2s耗在頁(yè)面的邏輯處理。當(dāng)時(shí),組長(zhǎng)當(dāng)機(jī)立斷,一方面要求對(duì)這些SQL進(jìn)行優(yōu)化,優(yōu)化到2s左右;另一方面將頁(yè)面的處理耗時(shí)降到1s內(nèi),這樣就能確保3s的性能要求。
SQL優(yōu)化任務(wù)自然落在我的頭上,8個(gè)SQL的代碼如下:
2、兵分兩路,把雞蛋放在兩個(gè)籃子里
看著這8個(gè)不長(zhǎng)不短整整齊齊的SQL,我的第一反應(yīng)是:一個(gè)頁(yè)面加載怎么會(huì)存在8個(gè)SQL語(yǔ)句?這8個(gè)SQL之間又有著什么樣的關(guān)聯(lián)關(guān)系?是否還可以合并成一個(gè)?
如果做SQL合并的話,就意味著我需要詳讀這8個(gè)SQL,但時(shí)間的指針已經(jīng)指在了17:00,離18:00下班不足一個(gè)小時(shí)。用中國(guó)足球賽事評(píng)論員的話說(shuō)就是“現(xiàn)在留給中國(guó)對(duì)的時(shí)間已經(jīng)不多了”,已經(jīng)沒(méi)有時(shí)間讓我解讀這8個(gè)SQL;況且,即便能快速解讀,也未必能合并。
那么就要像組長(zhǎng)提議的:尋求單個(gè)SQL的優(yōu)化突破。而8個(gè)SQL優(yōu)化到2秒,也就是說(shuō)單個(gè)SQL平均耗時(shí)在0.25秒,這個(gè)壓力也是非常大的。
我在與組長(zhǎng)簡(jiǎn)短商議后,為了降低風(fēng)險(xiǎn),不至于孤注一擲,做出了如下決定:兵分兩路,由我執(zhí)行合并方案,優(yōu)化小組的DBA負(fù)責(zé)單個(gè)SQL進(jìn)行優(yōu)化。
3、原來(lái)如此,不過(guò)如此
按照以往的習(xí)慣,我肯定會(huì)先自己解讀這8個(gè)SQL,因?yàn)槲蚁嘈艅e人的時(shí)間也是時(shí)間,能自己解決的盡量不要占用別人的時(shí)間。但這次不行了,因?yàn)闀r(shí)間不允許了,我必須要快速了解8個(gè)SQL的業(yè)務(wù)功能。
于是我跟SE表達(dá)了我訴求,SE立即安排了開(kāi)發(fā)責(zé)任人跟我對(duì)接。在與開(kāi)發(fā)人員長(zhǎng)達(dá)20分鐘的溝通后,終于理清了這個(gè)8個(gè)SQL的邏輯與關(guān)系,如下:
查詢?nèi)蝿?wù)列表,共3個(gè)SQL,共耗時(shí)1s,主SQL,包括了count和詳情查詢責(zé)任人:4個(gè)SQL,共耗時(shí)3s,但是頁(yè)面自上而下共耗時(shí)5s查詢網(wǎng)絡(luò)節(jié)點(diǎn):1個(gè)SQL共耗時(shí)0.5s這是個(gè)重大發(fā)現(xiàn):6s多的時(shí)間中,查詢責(zé)任人花費(fèi)了5s,這是要重點(diǎn)照顧的對(duì)象。我繼續(xù)向開(kāi)發(fā)責(zé)任人了解更多的信息:
“這四個(gè)SQL分別對(duì)應(yīng)四類權(quán)限,權(quán)限的最小單元是實(shí)體DU,在任務(wù)列表中獲取的DU,先用第一個(gè)SQL判斷哪些DU具有第一類權(quán)限,比如有100個(gè),那么傳入第二個(gè)SQL的DU就是90個(gè)DU,由此類推,知道完成了4類權(quán)限的判?!?/p>
聽(tīng)完后,我豁然開(kāi)朗,邏輯流程圖如下:
4、對(duì)癥下藥,一蹴而就
至此,我已成竹在胸。
四個(gè)SQL對(duì)應(yīng)四種權(quán)限,如果我們把TASK_ID比作學(xué)生,把USER_ID比作班級(jí),而將權(quán)限比作是學(xué)生選修的四門學(xué)科。那么“權(quán)限責(zé)任人查詢”就轉(zhuǎn)變成查詢當(dāng)前班級(jí)每個(gè)學(xué)生最高分的科目。
這是典型的按優(yōu)先級(jí)排序后取最大值的需求。當(dāng)前的方案是:
依次從DB中獲取四種權(quán)限對(duì)應(yīng)的DU_ID;在JAVA中根據(jù)DB返回的權(quán)限判斷權(quán)限類型。該方案存在兩個(gè)性能瓶頸:
將權(quán)限數(shù)據(jù)從DB傳輸?shù)絁AVA服務(wù)器是要一定的成本開(kāi)銷的;當(dāng)JAVA拿到權(quán)限數(shù)據(jù)數(shù)據(jù)時(shí),需要循環(huán)逐一歸集權(quán)限類型,這個(gè)過(guò)程也會(huì)帶來(lái)一定的性能問(wèn)題。如果我們能將權(quán)限類別歸集放在DB中完成,即DB只需要返回當(dāng)前用戶的DUID所屬權(quán)限類別即可,那么至少省卻了4次數(shù)據(jù)傳輸?shù)臅r(shí)耗。當(dāng)然,權(quán)限類型歸集無(wú)論是放在DB還是JAVA,都是需要成本開(kāi)銷,就看誰(shuí)的算法更具優(yōu)勢(shì)。事實(shí)上Oracle則提供了完整的解決方案,即用rank over來(lái)實(shí)現(xiàn)優(yōu)先級(jí)排序。
此時(shí)時(shí)間已經(jīng)到了17:20,我來(lái)不及多想,立馬對(duì)查詢責(zé)任人的4個(gè)SQL進(jìn)行合并改寫,合并后的SQL如下:
改寫后,放在DB中執(zhí)行,耗時(shí)0.98秒。這意味著,責(zé)任人查詢從5s成功降到了1s內(nèi),足足下降了4s;這樣,整體上也完全滿足性能要求。
我在17:25將SQL移交給了開(kāi)發(fā),留給開(kāi)發(fā)人員35分鐘時(shí)間去開(kāi)發(fā)驗(yàn)證。
結(jié)果自然是皆大歡喜,項(xiàng)目順利上線。
二、心得
1、學(xué)無(wú)止境的態(tài)度
當(dāng)SE拿到我合并的SQL后,滿臉的疑惑:
接著我又詳細(xì)講解了Rank的功用和用法。SE長(zhǎng)吁一聲說(shuō)道:“早知道Oracle有如此“神器”,當(dāng)初就也不用費(fèi)老大勁在Java中做權(quán)限類型歸集了,還弄出了性能問(wèn)題。看來(lái)真的是學(xué)無(wú)止境呀?!?/p>
在此,我無(wú)意于苛求SE“早知如此,何必當(dāng)初”,畢竟術(shù)業(yè)有專攻。唯一不解的是,偌大的一個(gè)項(xiàng)目組(近200人),居然沒(méi)有配置一名DB開(kāi)發(fā)工程師。建表,寫SQL這些活都是由Java開(kāi)發(fā)人員包辦。而在與Java開(kāi)發(fā)工程師溝通中了解到,部分人員根本沒(méi)有SQL基礎(chǔ),更不用說(shuō)是開(kāi)發(fā)經(jīng)驗(yàn)。而他們寫SQL的方式即簡(jiǎn)單又粗暴,是從同事那里拿一個(gè)功能類似的SQL,直接在此基礎(chǔ)上修改,也不知道該SQL的具體含義。
這種現(xiàn)學(xué)現(xiàn)賣的方式也直接導(dǎo)致了很大的性能問(wèn)題。正是因?yàn)榇_實(shí)了DB開(kāi)發(fā)工程師的崗位配置,大大弱化了SQL功能,使得DB退化成為僅僅是數(shù)據(jù)存儲(chǔ)功能,失去了真正的核心:組織和管理功能。
作為不僅僅是世界500強(qiáng)的企業(yè),作為國(guó)內(nèi)代表頂尖開(kāi)發(fā)水準(zhǔn)的企業(yè),在企業(yè)管理系統(tǒng)的開(kāi)發(fā)項(xiàng)目中,尚且不配置專職DB開(kāi)發(fā)工程師,而其它企業(yè)的開(kāi)發(fā)團(tuán)隊(duì)的人員配置就更可想而知了。
2、點(diǎn)到為止的哲學(xué)
在組長(zhǎng)的運(yùn)籌帷幄下,性能優(yōu)化小組在緊張備戰(zhàn)1017版本性能攻關(guān)的同時(shí),很好地保障了926版本的性能需求,使得926版本順利上線,I項(xiàng)目PM也揚(yáng)眉吐氣了一把:在性能紅線上,終于沒(méi)有求爺爺告奶奶放一馬了。在926版本上線后,一方面為表謝意,另一方面也為1017版本打氣,PM宴請(qǐng)了小組成員,席間問(wèn)起:
“真正的優(yōu)化,最大的空間還是在于從底層的模型設(shè)計(jì),以及寫出規(guī)范和優(yōu)秀的SQL,因此應(yīng)該在項(xiàng)目上配置專職的DBA………..”
“呃,黃工,這樣可不行,如果真的是這樣了,那你們干嘛呢?”
領(lǐng)導(dǎo)就是領(lǐng)導(dǎo),不正面沖突,在輕描淡寫中已經(jīng)說(shuō)明了一切,而后來(lái)我在內(nèi)部資料中看到“現(xiàn)固化,再僵化,后優(yōu)化”的流程策略時(shí),就更明白了。
- 消息稱去年全球IT支出超過(guò)5萬(wàn)億美元 數(shù)據(jù)中心系統(tǒng)支出大幅增加
- 2025年全球數(shù)據(jù)中心:數(shù)字基礎(chǔ)設(shè)施的演變
- 谷歌押注多模態(tài)AI,BigQuery湖倉(cāng)一體是核心支柱
- 數(shù)字化轉(zhuǎn)型支出將飆升:到2027年將達(dá)到4萬(wàn)億美元
- 量子與人工智能:數(shù)字化轉(zhuǎn)型的力量倍增器
- 華為OceanStor Dorado全閃存存儲(chǔ)榮獲CC認(rèn)證存儲(chǔ)設(shè)備最高認(rèn)證級(jí)別證書
- 2024年終盤點(diǎn) | 華為攜手伙伴共筑鯤鵬生態(tài),openEuler與openGauss雙星閃耀
- 特朗普宣布200億美元投資計(jì)劃,在美國(guó)多地建設(shè)數(shù)據(jù)中心
- 工信部:“點(diǎn)、鏈、網(wǎng)、面”體系化推進(jìn)算力網(wǎng)絡(luò)工作 持續(xù)提升算網(wǎng)綜合供給能力
- 2025年超融合基礎(chǔ)設(shè)施的4大趨勢(shì)
免責(zé)聲明:本網(wǎng)站內(nèi)容主要來(lái)自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準(zhǔn)確性及可靠性,但不保證有關(guān)資料的準(zhǔn)確性及可靠性,讀者在使用前請(qǐng)進(jìn)一步核實(shí),并對(duì)任何自主決定的行為負(fù)責(zé)。本網(wǎng)站對(duì)有關(guān)資料所引致的錯(cuò)誤、不確或遺漏,概不負(fù)任何法律責(zé)任。任何單位或個(gè)人認(rèn)為本網(wǎng)站中的網(wǎng)頁(yè)或鏈接內(nèi)容可能涉嫌侵犯其知識(shí)產(chǎn)權(quán)或存在不實(shí)內(nèi)容時(shí),應(yīng)及時(shí)向本網(wǎng)站提出書面權(quán)利通知或不實(shí)情況說(shuō)明,并提供身份證明、權(quán)屬證明及詳細(xì)侵權(quán)或不實(shí)情況證明。本網(wǎng)站在收到上述法律文件后,將會(huì)依法盡快聯(lián)系相關(guān)文章源頭核實(shí),溝通刪除相關(guān)內(nèi)容或斷開(kāi)相關(guān)鏈接。