Postgres的大表建议

时间:2017-04-14 09:47:29

标签: postgresql bigdata

为一个新的Postgres构建工作一些数字并想要一些关于分区/大小调整的建议,因为我已经姗姗来迟地意识到我将要创建一个超过40亿的行表并继续每年增加15亿行。

我最近移植到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亿行表转变为30-40亿行表,这似乎更易于管理,因为每个分区只有100-150m行而不是10亿行。此外,ID和范围将相同,因此索引应该更小。

缺点是大约1/3的列将是NULLS /原始结构中没有行。连接也将更少规范化。我不太可能增加更多的时期或等级,但我不能排除它。

问题2.我是否应该尝试创建多个表?

它与上述类似的问题 - 基本上我应该更难(不经常)编写查询,以便能够每天更快地加入。

问题3.将rankvalue作为smallint而非数字可以获得多少好处?

我更愿意将它存储为百分位数(介于0和1之间),以便在使用它时不必保持除以100,但认为在40b记录中可以节省内存。鉴于排名值不在任何索引中我怀疑我已经推翻了这个...

问题4.我可能错过了其他任何内容吗?

由于

1 个答案:

答案 0 :(得分:0)

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