2017-04-14 48 views
1

爲新的Postgres構建工作了一些編號,並希望得到關於分區/大小的一些建議,因爲我遲遲未意識到我即將創建一個40億個行表並不斷增加另外15億行年。Postgres的大型表格建議

我是新移民,從MSSQL的Postgres等仍試圖找出什麼是可能的/最好...

這是當前的表設計:

security_id int NOT NULL, -- 5,000-10,000 securities 
    ratio_id smallint NOT NULL, -- ~100 ratios 
    period_id smallint NOT NULL, -- between 1 and 5 periods 
    rank_id smallint NOT NULL, -- between 1 and 5 different ways to rank 
    rankvalue smallint NOT NULL CHECK (ratiovalue between 0 and 101), 
    validrangez tstzrange NOT NULL -- 30 years of dailyish data. 

隨着日期範圍有些記錄不會在幾個月內發生變化,其他記錄每天都在變化,而且時區也很重要,這就是我使用範圍的原因。有一個主要的約束,以避免重疊。

大多數查詢將查看validrangez中的特定日期,然後在該日期加入其他表中的所有內容。

我正在考慮劃分年份的上限(validrangez)。

問題1.我應該將period_id和rank_id字段轉換爲列嗎?

好處在於,這可能會將表格從400億行錶轉換爲3-4億行表,因爲每個分區只有100-150m行而不是10億行,因此似乎更易於管理。此外,ID和範圍將是相同的,因此索引應該更小。

缺點是大約1/3的列將是NULLS /在原始結構中不會有行。此外,連接將更少標準化。我不太可能增加更多的時間或等級,但我無法排除。

問題2.我應該嘗試創建多個表嗎?

它與上述類似的問題 - 基本上我應該使寫作查詢更難(不經常),以便能夠每天更快地進行連接。

問題3我將rankvalue作爲smallint而不是數字得到多少收益?

我寧願將它存儲爲百分位數(介於0和1之間),這樣當我使用它時,我不必保持除以100,但認爲跨越40b記錄節省的內存會加起來。鑑於排名不在任何指標,我懷疑我已經推翻了這一個...

問題4.任何其他我可能錯過了?

感謝

+0

'SELECT security_id,ratio_id,rankvalue,validrangez,array_agg(period_id),array_agg(rank_id)FROM表GROUP BY security_id,ratio_id,rankvalue,validrangez'這樣也會達到相同的行數你在問題1中的解決方案?如果是,那麼可以考慮聚合數組列中的一些數據。 –

+0

感謝 - 也必須將rankval作爲array_agg,這樣可以節省我存儲一些(可能是10-20%)的數據。每一點點都會幫助我懷疑。將需要檢查多少會減慢其他計算速度。 – user1487861

回答

0

可能是創建視圖一年明智會有幫助。另外還檢查CURSOR選項

+0

謝謝 - 我不確定擁有年份觀點而不是按年劃分的好處嗎?我會考慮使用CURSOR,但我的大部分SELECT語句只會帶回幾千條記錄 - 除非我誤解了您的建議? – user1487861