2011-05-09 26 views
6

是否有專門的數據庫 - RDBMS,NoSQL的,鍵值,或其他任何東西 - 這是用於運行快速彙總查詢或優化的地圖,減少這樣過非常大的數據集:聚合查詢是否有專門的數據庫?

select date, count(*) 
from Sales 
where [various combinations of filters] 
group by date 

到目前爲止,我已經在MongoDB和SQL Server上運行了基準測試,但是我想知道是否有更專業的解決方案,最好是能夠水平擴展數據的解決方案。

回答

1

對於某些類型的數據(大容量,時間序列)kx.com可能提供最好的解決方案:KDB +。如果它看起來像你的數據類型,試試看。注意:他們不使用SQL,而是使用更通用,更強大,更瘋狂的集合理論語言。

1

的Oracle,DB2倉庫版,並在較小的程度SQLServer的企業都在這些聚合查詢非常好 - 當然這些都是昂貴的解決方案,它取決於你的預算和業務情況非常其是否值得。

+0

您感覺在DB2和Oracle中可用的當前版本的SQL Server中缺少的任何特定功能? – 2011-05-09 14:58:11

+0

與性能問題沒有太大的關係。 DB2和ORACLE可以用不同的方式將負載分散到多臺機器上。 SQLServer幾乎侷限於一臺機器。 – 2011-05-10 01:48:11

2

幾乎任何OLAP database,這也正是他們設計的東西類型。

2

OLAP數據立方體是爲此設計的。您可以將數據歸一化爲可以快速計算的表單。非規範化和預計算步驟可能需要時間,因此這些數據庫通常僅用於報告並與實時事務數據分開。

3

以我的經驗,真正的問題有少做彙總查詢性能,我覺得這在所有主要的數據庫我已經試過好,比它與查詢的編寫方式做。

我失去了我已經看到了大量的連接和嵌入子查詢彙總各地的地方巨大的報表查詢的次數的計數。

關閉我的頭頂,典型的步驟,以使這些東西要更快一些:

  1. 使用窗口函數哪裏有合適的和適用的(即over()運營商)。多次重新提取數據絕對沒有意義。

  2. 在可用和適用的情況下(例如,您知道的設置相當小)使用公用表表達式(with查詢)。

  3. 使用臨時表獲得大型中間結果,在使用它們之前創建索引(並分析它們)。

  4. 通過儘可能早地過濾行來處理小型結果集:select id, aggregate from (aggregate on id) where id in (?) group by id可以通過將其重寫爲select id, aggregate from (aggregate on id where id in (?)) group by id來提高速度。如果適用,使用union/except/intersect all而不是union/except/intersect。這可以消除結果集的無意義排序。

作爲獎勵,前三步都傾向於使報表查詢更具可讀性,從而更易於維護。