2012-09-22 39 views
2

我有一個應用程序,其中有對每個「作業修訂版」進行了大量計算 - 這涉及與該修訂版鏈接的多行的總和。存儲總值或在運行時總結的最佳做法

什麼我不知道,如果是最好的做法是:

  1. 存儲在工作中修改一個「總」的數字,那麼我們可以總結起來
  2. 在運行時總顯示計算向用戶顯示
+0

如果數據庫支持物化視圖(例如Oracle)的或類似的結構,那麼這是另一種選擇。這樣的數據庫可以提供用於針對物化視圖進行查詢重寫的選項。 –

回答

4

這是高度依賴於幾個因素,如:

  • 如何重要的是準確性?數字顯示的時刻是否需要準確無誤?
  • 檢索速度有多重要?這個數字是否顯示得更爲重要,而不是準確?
  • 寫作速度有多重要?每個「行」寫得更快是否更重要?
  • 涉及多少數據?我們在談論數百萬行,還是數百?
  • 多行同時更新多久?一般情況下,「作業修訂版」的許多行是一次更新的,還是更有可能一次只涉及一行?

其中每一個都有不同的權衡,並且有多種選擇來滿足每個的平衡。

  • 您可以創建觸發器,在每次插入,更新或刪除新行時更新「緩存」總數。這將確保準確性和快速檢索,但會減慢寫入速度,因爲它每次都會涉及到「緩存」表的額外更新,這又會涉及到行級鎖定以確保數量保持準確。鎖定減慢其他操作的次數取決於同一次「作業修訂」中的其他操作同時發生的頻率。
  • 您可以每次計算該值。這確保了值的準確性,並且插入/更新速度很快,但計算該值可能效率低下且速度慢。
  • 您可以將值存儲在緩存表中,但只能定期更新。這確保了讀取和寫入速度都很快,但會降低準確性。

如果您只處理少數幾行,這些之間沒有太大的區別,並且「每次只計算一次」都很好。如果沒有實際需要讓事情變得更快,那麼每次計算都是首選,因爲「更多normal

一如既往:在一般情況下不要問什麼是好的。剖析自己的代碼,查看瓶頸位置,並傾向遵循「Don't, yet」規則。

0

這取決於。

如果有方便的方法可以解決問題,那麼您不需要一個可能很昂貴的查詢來計算出來。預先計算的一個大問題是複雜度的高低,你可以通過維護總計和數據來減少。

它的設計妥協,所以有什麼地方你最終沒有正確的答案。所有我想說的是,你應該把總數的預先計算作爲optmisation,所以如果你不知道你需要做的是,它是一個過早optmisation。

如果事情變得不合拍,你可以工作的平方你的數據的顯著量結束了。如果他們通過未修正的錯誤或未拔掉的差距而步調不穩,這是一項重大且持續不斷的工作。

不是你應該需要或實際上應該倉促。