【发布时间】:2021-07-06 15:33:05
【问题描述】:
对于全局应用程序,我们仅使用没有时区的时间戳。但是,为了方便用户,有些事情必须在当地时间。为了让它工作,我们必须处理从本地到 UTC 的转换,包括处理夏令时。我们不需要低于分钟的精度。
pg_timezone_names 包含我们需要的一切,包括时区名称的明确长字符串(例如,'US/Eastern')、间隔 utc_offset 和布尔值 is_dst。 (我假设后两个值会随着 dst 边界的变化而变化。)
假设我们最终拥有数百万用户,我正在尝试找出最佳性能模型。以下是正在考虑的选项:
- 位置表中的 TZ 名称字符串('US/Eastern')。每次需要进行时间转换(从本地到 UTC 或返回)时,我们直接调用 pg_timezone_names 来获取该时区的 utc_offset。 (这是假设视图索引良好。)当然,在位置表中的字符串上建立索引。
- 本地表 time_zones 复制 pg_timezone_names,但添加了 id 和 boolean in_use 列(并删除了缩写)。在位置表中包含 tz_id 作为外键而不是字符串。
在本地表的情况下,使用一个在 26 小时左右的每个小时后一分钟全天候触发的过程,以便时区可以更改,该过程检查刚刚通过两个的 in_use 时区列表AM Sunday(基于本地存储的偏移量)并调用 pg_timezone_names 以获取更新的偏移量和 is_dst 值。每当一个区域开始使用并确保它具有正确的值时,都会触发本地表检查的更新。
问题是,每次需要时先评估位置表中的索引字符串,然后从 pg_timezone_names 中提取偏移量,或者使用本地 time_zones 表通过 FK 提取偏移量,是否更快。我认为第二个会快得多,因为它避免了初始字符串处理,但这实际上取决于视图 pg_timezone_names 的速度。
【问题讨论】:
标签: sql database postgresql performance