我正在AWS上处理一个非常大的表(59亿行)(RDS m4.large),但在将数据处理到可以使用并有效查询的程度时遇到了一些麻烦。
数据具有从记录开始起数秒的时间变量(类型:bigint),但是我希望能够在每日级别(即GROUP BY天)上汇总数据。
我通过简单地创建日列并通过将秒转换为天来更新表以填充日字段来开始此过程:
ALTER TABLE tbl
ADD COLUMN day INTEGER;
UPDATE tbl
SET day=tbl.eventtime/86400+1;
在测试环境中(90天记录的前10天)运行良好,但是,也许出乎意料的是,它与50亿行的完整数据集并没有很好地配合。
尝试几次此过程后,我意识到我先前创建的索引使该过程大大减慢了速度(更新查询从未完成)。此后,我删除了所有索引,并再次尝试更新。在20个小时后的今天,查询仍然在运行,我想知道这种方法是否严重不适用于我正在处理的数据量。
我意识到另一种方法是将以秒为单位的时间转换为某种postgres时间戳类型-但是我不熟悉时间戳,并且不确定从哪里开始。
在一个如此大的表上执行更新吗?是否有其他方法可以更有效地将第二分辨率数据收集到可以按日汇总的点?
请让我知道是否需要其他信息。
答案 0 :(得分:0)
索引大大减慢了数据修改的速度,但是如果没有索引,您将无法有效地搜索大型表。
所以这里的技术是要尽可能少地索引。
您的想法再加上一列是不好的。除非您创建索引,否则它不仅会膨胀具有冗余数据的已经很大的表,而且也不会加快搜索速度。
如果需要搜索某天的所有行,则可以在相应的表达式上创建索引:
CREATE INDEX ON tbl ((eventtime / 86400 + 1));
然后,任何使用该表达式的搜索都可以使用索引,而您不必在表中存储其他数据。
这仅对查询数据有用。如果您想有效地进行汇总,索引将无济于事。在这种情况下,您应该使用实例化视图,也许您需要使用触发器来保持最新。