Not*_*hor 3 postgresql partitioning plpgsql postgresql-10
我有一个用于存储事件的表,该表timestamptz
使用按月按列分区PARTITION BY RANGE
。
目前有 5 个分区,每个分区包含一个月的跨度,从 开始FOR VALUES FROM ('2018-01-01') TO ('2018-02-01')
到结束FOR VALUES FROM ('2018-05-01') TO ('2018-06-01')
。
大多数数据都是以线性且可预测的方式输入的。但是,事件由报告事件的应用程序消耗,并且我确实必须允许随时输入过去的事件 - 其时间戳可能早于2018-01-01
,甚至是未来的事件(例如预计的费用)发生在未来的某个时间)。
我计划为过去的事件创建一个分区,这些事件的跨度将超过一个月,因为预计不会有太多此类事件。
我不确定对于尚未存在分区的未来事件的最佳方法是什么。
有没有办法获取我可以在现有分区中存储的最小/最大值?如果没有,我可以创建一个参考表来存储这些值,但我宁愿不必维护它。
我应该创建一个触发器来检查插入的每一行(看起来很昂贵)吗?我应该捕获插入错误并一次处理这些错误吗?
运行于PostgreSQL 10.3
.
有没有办法获取我可以在现有分区中存储的最小/最大值?
你还在评论中问:
您知道如何通过查询获取范围的下限和上限吗?
我不知道有任何专门用于此特定目的的系统目录信息功能。但:
各个分区通过后台继承链接到分区表;
pg_inherits
:
每个直接子表一个条目
pg_class.relpartbound
分区边界以内部格式 ( )存储pg_node_tree
。pg_get_expr(pg_node_tree, relation_oid)
可以:
反编译表达式的内部形式
我们可以根据这组线索构建一个查询。基于手册中范围分区的示例:
Run Code Online (Sandbox Code Playgroud)SELECT i.inhrelid::regclass , partition_bound , split_part(partition_bound, '''', 2) AS lower_bound , split_part(partition_bound, '''', 4) AS upper_bound FROM pg_inherits i JOIN pg_class c ON c.oid = i.inhrelid , pg_get_expr(c.relpartbound, i.inhrelid) AS partition_bound WHERE inhparent = 'measurement'::regclass;
因赫雷利德 | 分区绑定 | 下限 | 上限 :-------------------- | :------------------------------------------------------------ | :---------- | :---------- 测量_y2006m02 | 对于从 ('2006-02-01') 到 ('2006-03-01') 的值 | 2006-02-01 | 2006-03-01 测量_y2006m03 | 对于从 ('2006-03-01') 到 ('2006-04-01') 的值 | 2006-03-01 | 2006-04-01
db<>在这里摆弄
限制:
relpartbound
。pg_inherits
才能覆盖子分区。