問題背景:
公司項目更新一個功能,所有的會員可以申請代理一款產(chǎn)品。提交申請時會傳遞會員信息代理產(chǎn)品信息等,大概有10個參數(shù)??赡苡捎谇捌谏暾埓淼娜吮容^少,所以比較正常。公司做了一次促銷活動后,量突然大了起來,這個時候,客戶反饋,申請代理時,APP反應很慢,大概需要等待10秒左右才反饋結果。經(jīng)過APP端及JAVA后端同時測試發(fā)現(xiàn)是我提供的API響應速度比較慢。
問題排查:
1、通過測試服務器調(diào)用API測試發(fā)現(xiàn),響應速度正常(說明代碼沒問題,至少是量少的情況下沒問題)。
2、通過正式服務器數(shù)據(jù)庫調(diào)用存儲過程直接執(zhí)行,響應速度正常。
3、通過正式服務器調(diào)用API測試發(fā)現(xiàn),響應速度比較慢。
4、使用日志跟蹤API各個模塊執(zhí)行執(zhí)行,最后發(fā)現(xiàn),調(diào)用存儲過程執(zhí)行返回結果這一步,響應速度比較慢。
至此,問題已經(jīng)找到了:代碼調(diào)用存儲過程執(zhí)行慢,待使用數(shù)據(jù)庫管理器執(zhí)行就很快。
猜測原因:sql預編譯的問題。
解決方案:使用WITH RECOMPILE強制SQL重新編譯(一般我們編寫存儲過程是不會加這個 WITH RECOMPILE 的)。

存儲過程示例