为一个新的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.我可能错过了其他任何内容吗?
由于
答案 0 :(得分:0)
可能会创建视图年度明智会有所帮助。另外还要检查CURSOR选项