【问题标题】:Postgres time update on large table大表上的 Postgres 时间更新
【发布时间】:2019-04-11 01:39:15
【问题描述】:

我正在处理 AWS (RDS m4.large) 上的一个非常大(59 亿行)的表,并且在将数据获取到可以有效处理和查询的点时遇到了一些麻烦。

数据从记录的开头开始有一个以秒为单位的时间变量(类型:bigint),但我希望能够在每日级别(即 GROUP BY 天)汇总数据。

我通过简单地创建一个天列开始这个过程,并通过将秒转换为天来更新表格以填充天字段:

ALTER TABLE tbl
ADD COLUMN day INTEGER;

UPDATE tbl
SET day=tbl.eventtime/86400+1;

它在测试环境中运行良好(90 天记录的前 10 天),但可能出乎意料的是,它在完整的 50 亿行数据集上运行得不是很好。

在尝试了几次这个过程后,我意识到我之前创建的索引大大减慢了这个过程(更新查询从未完成)。我已经删除了所有索引并再次尝试更新。 20 小时后,查询仍在运行,我想知道这种方法是否非常不适合我正在处理的数据量。

我意识到另一种方法是以秒为单位的时间转换为某种 postgres 时间戳类型 - 但我不熟悉时间戳,不知道从哪里开始。

对这么大的表执行更新可行吗?是否有一种不同的方法可以更有效地将第二分辨率数据获取到可以按天汇总的程度?

如果需要任何其他信息,请告诉我。

【问题讨论】:

    标签: postgresql amazon-web-services amazon-rds large-data


    【解决方案1】:

    索引会大大减慢数据修改速度,但如果没有它们,您将无法有效地搜索大表。

    所以这里的艺术是尽可能少的索引。

    您增加一列的想法很糟糕。它不仅会使已经很大的表因冗余数据而膨胀,而且除非您创建索引,否则它也不会加快搜索速度。

    如果您需要搜索某一天的所有行,您可以在相应的表达式上创建一个索引:

    CREATE INDEX ON tbl ((eventtime / 86400 + 1));
    

    那么任何使用此表达式的搜索都可以使用索引,而您不必在表中存储额外的数据。

    这仅对查询数据有用。如果你想有效地聚合,索引对你帮助不大。在这种情况下,您应该使用物化视图,也许您可​​以通过触发器保持最新状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 2013-09-18
      • 1970-01-01
      • 2023-03-31
      • 2010-10-05
      • 2016-06-04
      相关资源
      最近更新 更多