在我們日常工作中,總會遇到一個查詢功能需要對首次查詢結果進行二次甚至是多次處理才能得到最終需要的數據的情況。先不談如何避免這種情況,這裡只說一下出現這種情況的處理辦法。 假設存在以下場景:存在訂單表OrderInfo和訂單擴展表OrderInfoExtend,因為某種特殊原因,不能夠在一次SQL查詢 ...
在我們日常工作中,總會遇到一個查詢功能需要對首次查詢結果進行二次甚至是多次處理才能得到最終需要的數據的情況。先不談如何避免這種情況,這裡只說一下出現這種情況的處理辦法。
假設存在以下場景:存在訂單表OrderInfo和訂單擴展表OrderInfoExtend,因為某種特殊原因,不能夠在一次SQL查詢將兩個表進行關聯查詢,需要先查詢OrderInfo,然後根據Id查詢OrderInfoExtend表的數據,最後再組裝成需要的數據,那麼大概會有以下代碼:
1 var orderInfoList=Query("OrderInfo"); 2 3 foreach(var item in orderInfoList) 4 5 { 6 var extendModel=QueryOrderInfoExtendForId(item.Id); 7 item.ExtendInfo=extendModel?.ExtendInfo; 8 }
從邏輯上來說沒有問題,也能夠正常查詢出來數據,但是假設orderInfoList的記錄有1000條,每次查詢OrderInfoExtend的時間在50ms,那最終查詢到結果的時間大致就是50ms*1000=50000ms=5s。並且這個時間會隨著記錄的增多或者迴圈內部調用查詢的時長的增加而增長,最終給用戶的體驗就是查詢數據特別的慢。
實際上對這個問題進行分析會發現,主要耗時在於迴圈的時候每次都需要進行一次連接數據獲取數據的步驟,如果減少數據獲取的次數,就可以解決耗時的問題。那麼可以調整如下:
1 var orderInfoList=Query("OrderInfo"); 2 3 var ids=BuildIds(orderInfoList); 4 5 var extendList=QueryOrderInfoExtendForIds(ids); 6 7 foreach(var item in orderInfoList) 8 9 { 10 var item.ExtendInfo=extendList.Where(o => o.OrderId == item.Id).FirstOrDefault()?.ExtendInfo; 11 }
這樣將原有的迴圈獲取改為只執行一次資料庫獲取,相當於整個獲取步驟只執行了兩次資料庫操作,大大提高了數據查詢速度。