我們正在研究一種算法,用於計算通過可變路線將資源從多點移動到點X的最佳方式,並且過程如下所示:傳遞業務邏輯(c#)來處理(sql)會提高性能嗎?
1)獲取所有可能的路線(DB命中以獲取所有路線參與溶液)
2)獲取所有可能的出發點
3)建立一個雙向圖中所有的路線相結合。
-----的foreach起點----
4)計算使用霍夫曼Pavley算法(第k最短路徑我們限制該一定數量路徑EI:第10個shortes路徑)
用於實際起點-----
5) - - - - 的foreach路徑評估路線計算多少資源瓦特e可以從每個路線節點運送到目的地
6)根據從每個點移動的資源數量和移動和轉運數量(將資源從一個運輸工具轉移到另一個運輸工具)分配一個標點符號可能的方案。
-----爲實際起點-----
----- END的foreach起點END的foreach路徑----
7)返回由標點符號排序的可能解決方案
該邏輯的第一個版本花費了大約1分鐘來計算解決方案。但是在第二次修訂中,我們發現我們有很多Select N + 1問題,所以我們優化了查詢(不是全部),現在每次運行需要3-10秒,具體取決於變量的數量。
但現在有人建議通過所有的邏輯來處理SQL,並讓SQL服務器處理所有的計算,他說,由於所有的數據已經在SQL Server上,數據庫將花費更少的時間來完成所有的計算避免了所有選擇N + 1和延遲加載問題。同時他也關心併發性,運行這個邏輯的多個用戶會關閉應用服務器,但他說sql-server可以很好地處理這種負載。
我的意見:也許我們應該在嘗試將1500行c#邏輯傳遞給Transact SQL之前嘗試優化所有查詢。更不用說,對於某些計算,我們使用的是雙向圖和Hoffman Pavley算法的第三方庫,這些算法在交易中不可用,或者我們需要尋找其他已經在交易中編寫或者實現了所有這些邏輯的東西。
注意:我們使用Nhibernate作爲ORM。
不能+1達到的限制,但 - 同意,將邏輯轉移到sql可能導致真正的維護和性能的痛苦。 – 2010-12-15 22:42:41