2013-07-16 39 views
1

背景:倉庫PostgreSQL數據庫架構的建議

我開發一個應用程序,允許用戶生成許多不同的報告。數據存儲在PostgreSQL中,具有自然唯一的組密鑰,因此具有一個組密鑰的數據與其他組密鑰完全獨立。報告一次僅使用1組密鑰構建,因此所有查詢都使用「WHERE groupKey = X;」條款。 PostgreSQL中的數據通過將數據添加到不同組的並行進程進行密集更新,但我不需要實時報告。每30分鐘更新一次就可以了。

問題:

大約有4音樂會的數據已經和我發現,一些報告需要顯著時間來生成(最長15秒),因爲他們需要查詢不是一個單一的表,但3-其中4個。

我想要做的是減少創建報告所需的時間,而不會顯着改變解決方案的技術或方案。

可能的解決方案

我在想什麼,這是:

  1. 拆分一個數據庫分成多個數據庫爲每組鍵1級的數據庫。然後,我將擺脫WHERE groupKey = X(儘管我在每個表中的列上都有索引),並且每次處理的行數都會少得多。

  2. 創建只讀的從屬數據庫。然後,我將不得不與同步例如一次每十五分鐘的PostgreSQL的複製機制的數據(其實我可以這樣做嗎?或者我必須編寫自定義代碼)

我不想更改數據庫到NoSQL,因爲我將不得不重寫所有的SQL查詢,我不想。如果它是免費的並且在Windows上運行(對不起,沒有Linux服務器,但如果必須的話可能有一個),我可能會切換到支持列存儲的另一個SQL數據庫。

你的想法

你有什麼建議作爲第一個簡單的步驟?

回答

1

立即想到兩個想法報告:

1)。設置一些摘要(即「聚合」)表,這些表是用戶可能運行的查詢的預計算結果。例如。包含按各種維度分組的計數和總和的表格。這可以是一個自動化的過程 - 數據庫函數(或腳本)通過您選擇的作業調度程序運行 - 每N分鐘刷新一次數據。 2)。關於複製,如果您正在使用流式複製(PostgreSQL 9+),則將主數據庫中的更改複製到從屬數據庫(熱備份=只讀)以進行報告。

+0

1.它可能是一個可能的解決方案,但我將不得不重寫所有使用初始表來使用這些聚合的函數,對嗎? – Sergei

+0

2.我會檢查這個。這似乎是現在最簡單的解決方案,但我不明白這是否真的有幫助 – Sergei

+0

對於上述第1點,更正,查詢將需要重寫。在什麼程度上我不能說 - 它可以像刪除一些JOIN和從單個表或視圖中選擇一樣簡單,而不是多個表。 – bma

0
  1. 調整報告查詢。使用解釋。當你可以在純SQL中執行時避免過程。
  2. 調整服務器;內存,磁盤,處理器。看看服務器配置。
  3. 升級postgres版本。
  4. 做真空。

4箇中只有1個需要對應用程序進行重大更改。

+0

是否有用戶界面的postgresql查詢分析器?我只看到了將數據轉儲到難以分析的文件中的嵌入式文件。你使用任何? – Sergei

+0

本身不是用戶界面,但是如果您將EXPLAIN ANALYZE的輸出剪切並粘貼到http://explain.depesz.com,則可以更好地瞭解發生了什麼。該計劃從下往上閱讀。 – bma

+0

那麼,目前我不使用任何分析器,因爲幸運的是沒有SQL性能問題:D您可以通過EnterpriseDB嘗試SQL Profiler – hanzpk