【发布时间】:2018-02-22 18:01:22
【问题描述】:
我希望在我的应用程序中添加 VALIDTIME 临时支持,并希望获得一些反馈。看起来 Postgres 还没有本地时间支持(我知道有扩展),所以我现在必须采用手动策略。从逻辑上讲,这就是我所追求的:
CREATE TABLE MyPartitionedTable(
c1 int,
ValidTS tstzrange -- VALIDTIME field
)
PARTITION BY LIST (
(
CASE WHEN CAST(UPPER(ValidTS) AS DATE) = DATE '9999-12-31' THEN 1 -- Store all current rows in one partition
ELSE 0 -- Store everything else in another partition
END
)
)
时间
当前行:UPPER(ValidTS) = '9999-12-31 23:59:59.999999'
旧行:UPPER(ValidTS) <> '9999-12-31 23:59:59.999999'
临时删除:UPDATE“当前行”和set UPPER(ValidTS) = current_timestamp
临时插入:INSERT“当前行”
临时更新:临时DELETE + 临时INSERT(必须在同一事务中完成)
时间选择(当前):SELECT "Current row"
时间选择(AS OF):SELECT ... WHERE ValidTS @> <AS_OF_TS>
分区
Postgres 10 支持本地表分区,所以我想利用它:
- 当前行的分区(超级快速查找)
- 历史行的分区(如果需要,可以使用子分区)
我一直在玩它,似乎有一些限制。例如,我不能像上面的例子那样使用CASE 语句——关于IMMUTABLE 表达式的错误。我认为这与使用TIMESTAMP WITH TIME ZONE 有关。此外,文档说您不能在分区表上定义 UNIQUE / PRIMARY KEY 约束。
我的问题
- 我的时间设置看起来如何?你的设置是什么?有什么提示或注意事项吗?
- 您对时态数据的分区策略是什么?您如何确保快速访问当前行?有什么要注意的吗?
【问题讨论】:
标签: sql postgresql partitioning ddl temporal