2012-05-03 59 views
4

我有什麼:PostgreSql中的十億行:分區還是不分區?

  • 簡單服務器與一個至強8個邏輯核心,16 GB的RAM,2×7200轉驅動器的mdadm RAID1。
  • PostgreSql
  • 需要處理大量數據。每天最多導入3000萬行數據。
  • 時間 - 複雜查詢可以執行長達一個小時

簡化表的模式,那將是非常大的:

id| integer | not null default nextval('table_id_seq'::regclass) 
url_id  | integer | not null 
domain_id | integer | not null 
position | integer | not null 

與上述模式的問題是,我不沒有關於如何分區的確切答案。 所有期間的數據將被使用(沒有查詢將有日期過濾器)。

我想過在「domain_id」字段上進行分區,但問題是很難預測每個分區將有多少行。

我的主要問題是:

確實是做,如果我不使用分區修剪感對數據進行分區,我不打算刪除舊數據?

那會是什麼優點/缺點?

如果我不進行分區,如何降低進口速度?

相關正常化的另一個問題:

如果URL被導出到另一個表?歸一化的

優點

  • 表將不得不用的20-30字節平均大小的行。
  • 加入的「url_id」應該是比「URL」欄中
  • 非規範化

    • 數據可以多進口,更快,因爲我不的

    優點的速度快得多,在每次插入之前,不得不查找「url」表。

有人可以給我任何建議嗎?謝謝!

+0

頭正常化,尾巴你不✔ –

+1

根據你想要用這些數據做什麼,你可能會在硬件上有點動力不足 - 尤其是磁盤陣列。你需要仔細調整和設計你的工作流程纔有機會。不要誤解我的觀點,我們在PostgreSQL數據庫中擁有5TB數據的機器,每天都會有數千萬的請求出現,而且性能非常出色,但我們並沒有運行在一對7200 RPM的驅動器上。 – kgrittn

回答

10

如果要在大多數查詢中使用選擇條件,允許規劃人員大部分時間跳過對大部分分區的訪問,或者要定期清除分配給所有行的所有行,則分區是最有用的一個分區,或兩者。 (刪除表格是刪除大量行的非常快速的方法!)我聽說有人觸及了一個門檻,分區幫助保持索引更淺,從而提高性能;但是真的可以回到第一點,因爲您將索引樹的第一層有效地移動到另一個地方 - 它仍然必須發生。

就它而言,聽起來不像分區會有幫助。另一方面,標準化可能會提高性能,超出您的預期;通過保持所有這些行更窄,您可以將更多這些行放入每個頁面,從而減少整體磁盤訪問。我會做適當的第三範式正常化,並且只會偏離基於它會有所幫助的證據。如果在數據的第二個副本仍有磁盤空間的情況下出現性能問題,請嘗試創建非規格化表並查看性能與規範化版本的對比情況。

+0

非常感謝您的回答! –

1

我認爲這是有道理的,這取決於你的用例。我不知道你的30B行歷史記錄有多遠,但是如果你的交易數據庫不需要超過你決定的幾個分區,那麼劃分是有意義的。

例如,如果您每次只查詢兩個月的數據值,按月分區非常合理。一年中的其他十個月可以移入報告倉庫,使交易存儲空間更小。

您可以在分區中使用的字段有限制。你必須小心這些。

獲取性能基準,進行分區並重新檢查性能影響。

+0

我在我的文章中寫道:「所有時期的數據都將被使用。」。這裏我的意思是,沒有查詢將有日期過濾器。這就是爲什麼我問這裏,是否有意義的分區。 –

0

考慮到給定數量的數據,您將主要在IO上等待。如果可能的話,使用不同硬件配置執行一些測試,試圖爲您的方案獲得最佳IO數據。恕我直言,2個磁盤在一段時間後將不夠用,除非在幕後有其他內容。

你的餐桌每天都會以已知的比例增長。最有可能的是每天都會被查詢。因爲您沒有提到要清除的數據(如果將是,那麼請對其進行分區),這意味着查詢每天都會運行得更慢。在某個時間點,您將開始查看如何優化您的查詢。其中一種可能性是在應用程序級別並行查詢。但是這裏應該滿足一些條件:

  • 你的表應該被分區以便並行化查詢;
  • HW應該能夠在N個並行流中傳送請求的IO數量。

所有答案都應該由不同設置的性能測試給出。

正如其他人提到的那樣,DBA在分區表中有更多好處,所以我個人會對任何預計每間隔會接收5M以上的行的表進行分區,無論是日,周還是月。

+0

這裏的主要問題 - 如果我不使用分區修剪,並且我不會刪除舊數據 - 我是否會從分區中獲得任何好處,例如,按日期(以預測行的傳播)? 一百個小表/索引會比一個大表/索引執行得更好嗎?在什麼情況下? –

+0

對於分區表的DBA維護更容易,因爲所有操作都可以按每個分區完成,因此對系統和其他查詢的影響較小。對於ORACLE,即使我們預計性能不會提高,我們也會劃分所有大型表。儘管現在我們已經通過分析查詢,在所有情況下設法找到了一個很好的分區鍵。我建議你進行一些測試以獲得更好的照片。 – vyegorov

+1

這個問題特別關於PostgreSQL,而在PostgreSQL中,分區在大多數情況下並不會*簡化DBA的操作。目前還沒有一種聲明式的分區方式;它通過繼承機制以相當手動的方式實現。在PostgreSQL中進行分區不允許查詢的執行被並行化 - 至少由計劃者來執行;我想你可以建立多個連接,並用單獨的查詢查詢每個分區的數據,並在完成所有結果後以某種方式將所有結果集中在一起,但在兩個似乎不太可能取勝的驅動器上。 – kgrittn