Postgres的大型表格建议

问题描述:

为新的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

可能是创建视图一年明智会有帮助。另外还检查CURSOR选项

+0

谢谢 - 我不确定拥有年份观点而不是按年划分的好处吗?我会考虑使用CURSOR,但我的大部分SELECT语句只会带回几千条记录 - 除非我误解了您的建议? – user1487861