2015-11-26 120 views
0

我們有一個由數據庫(當前Oracle,計劃支持MS SQL Server以及幾十個表)支持的產品。爲了簡單起見,我們需要一個名爲TASK的表。計算DB中幾列的計數

我們有一個用例時,我們需要向用戶呈現具有特定標準的任務數。例如,假設許多列任務表中有,有3列適合這種使用情況:

  • 優先級的可能值低,中,高
  • 所有者 - 可能的值是在註冊用戶系統(可能是10秒)
  • 狀態 - 可能值IDLE,IN_PROCESS,DONE

因此,我們要準確地顯示用戶多少任務是低,中,高,其中有多少是由一些擁有特定用戶,以及有多少屬於不同的狀態。當然,基本的實施將是對TASK表的每一個修改都保持這些計數是最新的。然而,使事情複雜化的事實是,用戶可以通過一些標準來額外地過濾結果,該標準可以包括(或不包括)上述列的一部分。

例如,利用可能希望看到這些罪名只適用於由他擁有,並已於上月創建的任務。可能的濾波器組合的數量在這裏是無窮的,所以不用說保持最新的計數是不可能的。

所以問題是:如何解決這個問題而不會嚴重影響數據庫性能?它可以完全通過數據庫解決,還是應該使用其他數據存儲,如稀疏數據存儲?這感覺就像許多公司現在一直存在的問題。例如,在亞馬遜商店中,您可以在使用任意文本搜索條件時查看類別數量,這意味着他們也可以在現場進行計算,而不是始終保持最新。

最後一兩件事:我們可以接受一定的功能限制,說數應確切高達100,但是從100開始可以只說「100任務」。也許這種緩解可以讓我們發出更有效的SQL查詢。

謝謝!

回答

0

據我瞭解,你想有大約3種不同的發行方式:跨優先級,所有者和狀態。我想解決這個問題的最好方法是維護3個不同的數據源(如SQL查詢,DB或Redis中的聚合信息等)。

計算這個數據我看到的建立每個分發單獨的SQL查詢的最簡單方法。例如,對於優先它會是這樣的:

SELECT USER_ID, PRIORITY, COUNT(*) 
FROM TASKS 
[WHERE <additional search criterias>] 
GROUP BY PRIORITY 

當然,它不是在數據庫性能方面最有效的方式,但它允許保持計數是最新的。

如果你想存儲可以顯著降低數據庫負荷累計值(這取決於行數),所以你可能需要建立哪些維度應該是可用的搜索條件的立方體。採用這種方法,您可以實現限制功能。

+0

謝謝Max。這當然是我們已經測試過的天真方法。問題是 - 這表現是可怕的。這樣的查詢不僅需要相當長的時間才能完成,這當然會影響對數據庫執行其他簡單查詢的其他用戶。所以我一直在尋找創造性的方法來解決這個問題,這個問題會以某種方式在一段時間內以更統一的方式分配這個負載。 – Stas