緣起
今天早上一到公司,技術支持的小夥就說一個後臺報表,計算的任務完成率超過100%,有異常,客戶要用,比較急,要解決這個問題。
解決過程
自從接了上任的報表計算,這個就頭疼,沒辦法硬着頭皮查什麼原因,報表的SQL比較簡單,一個查:接受任務數表a, 一個查:完成任務數表b
a和b表,都是直接計算的結果表。
第一步: 看看是否原始查詢報表的導致數據缺少,如join,left join登,去掉相關表的關聯,修改join如left join,看看數據是否有變化,
修改完,數據還是沒變化,確認不是SQL關聯和join表的問題
第二步: 單獨拿出執行的SQL,爲了取到合適的SQL,特意開了騰訊雲的雲審計,查詢後獲取完整的SQL,單獨查詢“”接收任務數“和“”完成任務數”,
單獨查詢查出的數據和上面的顯示是一樣的,看計算的存儲過程,也複雜,找不到是存儲過程哪錯,怎麼知道計算數據是錯的。 怎麼處理?
這就陷入的困境,不知道計算的數據哪個是錯的,可能2個多錯,可能其中只有一個錯的,怎麼排查?這時技術支持有提示新信息,感覺這個問題必須解決。
弄了一陣子,沒有頭緒,感覺就煩,這個事情也沒什麼意思,都是多少年前的問題還遺留到現在出現,出現牴觸的心情。但是事情要解決!
心靜了一下,分析了一下,2個數據到底是哪個出現問題,還是複雜的存儲過程計算邏輯有bug,先從哪裏入手?
這些數據,就這個完成任務數據大,是否可以先查這個任務完成數據,根據常識,先暫且認爲接收任務數是對的,先把完成任務完成數據排查清楚(計算清楚)
接着就把計算完成任務數,計算SQL整理出來,使用最原始的SQL,查詢出結果,發現和計算的結果不一致,結果只有7600多,少於新任務數的7700多,更是少於計算的8400多的原來結果
這樣確認了計算結果出現問題,就用原始的計算SQL,從新repalce into替換原來的老數據,查詢報表發現還是有問題,原來表中有2個日期(任務日期task_date,完成日期finish_date),我只通過finish_date寫入替換,歷史的數據task_date的確有些數據,但是這個都是完成歷史數據,和這個任務日期無關,查了一下,的確可以刪除掉,執行下面SQL清理垃圾數據OK
delete from b where task_date>='2024-04-01' and task_date <= '2024-04-28'
執行後,報表的完成數據已經OK
總結
1, 遇事情不要急躁和退卻,只會添加煩勞,對解決問題毫無幫助
2,當不知道如何入手時,可以根據常識去判斷,從最容易出錯的地方入手,減少排查面
3,使用了中間結果,可以直接用原始SQL數據查詢,跳過原始的複雜計算邏輯排查