爲新的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.任何其他我可能錯過了?
感謝
'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中的解決方案?如果是,那麼可以考慮聚合數組列中的一些數據。 –
感謝 - 也必須將rankval作爲array_agg,這樣可以節省我存儲一些(可能是10-20%)的數據。每一點點都會幫助我懷疑。將需要檢查多少會減慢其他計算速度。 – user1487861