【问题标题】:How Do I aggregate Data By Day and Still Respect Timezone?如何按天汇总数据并仍然尊重时区?
【发布时间】:2021-04-18 17:56:57
【问题描述】:

我们目前正在使用一个汇总表,以 UTC 时间每小时为基础为我们的用户汇总信息。我们遇到的问题是这个表变得太大并且极大地减慢了我们的系统。我们已经完成了为 PostgreSQL 推荐的所有调整技术,但我们仍然遇到缓慢的问题。

我们的想法是按天而不是按小时开始汇总,但问题是我们允许客户更改时区,从而重新计算当天的数据。

有谁知道如何存储每日摘要,但在切换时区时仍然尊重数字和总数?

【问题讨论】:

  • 我们是在谈论地球上的所有时区吗?
  • 严格来说,对于数据建模,当您进行日粒度时,您会丢失时区级别的详细信息。但是,您也许可以按时区汇总,尤其是当@MPelletier 的问题的答案是“否”时。
  • @MPelletier 我们现在按小时聚合,所以我们只支持“整点”的时区
  • @bobs 这行数据没有时区信息,都是UTC。当用户想要查看他们在某一天、某个时区赚了多少时,就会发生这种变化。
  • 进一步澄清,如果他们在 1 日每小时赚 1 美元 (UTC),然后在 2 日和 3 日每小时赚 2 美元 (UTC),如果他们在美国东部标准时间观看第二次加起来应该是 20 美元,如果他们将时区更改为 UTC,那么加起来是 24 美元

标签: sql database database-design data-warehouse


【解决方案1】:

使用 timeoffset 列和“day”字段(日期)汇总表中的数据,该字段是该特定汇总行的日期。索引(timeoffset、day、其他相关字段),如果可能的话聚集(大概 PostgresSQL 有聚集索引?),一切都应该很好。

【讨论】:

  • 因此,不是每天 24 行,而是一天会产生一行……乘以 24 个时区。我在这里看不到实质性的收益。
  • 我想过这个,但是我必须维护 24 个汇总表,这也会增加时区之间报告差异的可能性。
  • @MPelletier - 不同之处在于您不需要汇总一天的 24 行来生成每日数据 - 您可以提取特定时间偏移量/天的一个摘要行 - 所以您'正在做 1/24 的工作——当然还有适当的索引。
  • @Russ - 你没有 24 个汇总表 - 只有一个,但有一个 timeoffset 列,表示距 GMT 的小时数,而 day 列表示该特定时间偏移的日期.您将有 24 行用于 24 个时间偏移(如果您需要更多或更少的时区,则更多或更少)。
  • @Russ - 我认为您不必担心现有的聚集索引 - 如果您在该索引的开头添加 timeoffset 和 day 您仍然会从中受益 只需要扫描相关的行 - 这是一种更易于维护的表中的“24 表”方法。 :) 有兴趣听听这是怎么回事。
【解决方案2】:

我假设您已经了解了所有分区注意事项,例如按用户分区。

根据使用模式,我可以看到几种解决您问题的方法。

  1. 根据用户选择每天汇总数据。如果时区发生变化,则以编程方式重新计算此合作伙伴的聚合。如果时区更改不频繁,并且如果用户更改时区时可能会引入一定的数据延迟,则这是合理的。

  2. 如果您的度量值相对较少,您可以为每个度量值保留 24 列 - 每列描述该度量值在不同时区的每日汇总。

  3. 如果时区更改频繁且有多种衡量标准,那么 24 个不同的聚合表似乎是可行的方法。

【讨论】:

  • 实际上,时区变化相对较少。我可以根据更改以编程方式重新计算措施,但第一次更改会有很大的延迟。我们有大约 8 个度量,每个度量 24 列不是一个好主意。我开始认为 24​​ 桌是要走的路。我研究了@Will A 的解决方案,它可能适用于柱状数据库。但不是随着行数而降级的数据库。
  • 192 个整数列实际上还不错。如果您将使用柱状数据库,我认为您不需要任何架构更改 - 至少不需要考虑上述问题。
【解决方案3】:

我也遇到了这个问题。我采取这个解决方案:日期类型的数据使用本地时区,其他日期时间类型的数据使用UTC时区,因为统计索引是本地的。另一个原因是我们现在只有本地数据。

【讨论】:

    【解决方案4】:

    我面临同样的问题。我正在考虑按日期和时间聚合(UTC 每小时)。然后你可以相应地获取你想要的任何时区的数据。不幸的是,如果您需要支持有 45/30/15 分钟偏移的时区,这将不起作用。 然后你可以按 15 分钟聚合数据。解决方案取决于要聚合的数据量。

    【讨论】:

      猜你喜欢
      • 2022-11-19
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      • 2021-12-15
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 2016-01-11
      相关资源
      最近更新 更多