Postgres Temporal / Partitioning实施策略

时间:2018-02-22 18:01:23

标签: sql postgresql partitioning ddl temporal

我希望为我的应用添加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'

Temporal DELETE UPDATE“当前行”和set UPPER(ValidTS) = current_timestamp
Temporal INSERT 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约束。

我的问题

  1. 我的时间设置如何?你的设置是什么?任何提示或要注意的事项?
  2. 您的时态数据分区策略是什么?您如何确保快速访问当前行?有什么值得注意的吗?

1 个答案:

答案 0 :(得分:1)

有关您的设置的一些评论:

  1. PostgreSQL无法在分区之间自动移动行。(

  2. 我希望有<link rel="stylesheet">validfrom时间戳,但我只能在您的说明中看到一个时间戳。您想如何实施validto

  3. 我认为将时间戳存储为文本不是一个好主意。将其存储为AS OFdate,然后您对非timestamptz函数没有任何问题。然后我会使用IMMUTABLE而不是像infinity这样的任意日期用于活动行。

  4. 我不会对表进行分区,而是使用索引。如有必要,您可以使用9999-12-31创建部分索引。如果对当前数据的所有查询都包含相同的条件,则将使用这些索引。我想这取决于你的查询什么是最好的方法。当然,为了加快顺序扫描,只有分区才有用。