【发布时间】:2013-04-17 00:20:13
【问题描述】:
我可以想象按日期(尤其是日志)的表分区是一种广泛使用的东西,但我无法为我的问题找到一个好的答案。
我想按周创建一个表分区(记录的数量很大,以使其每月一次)。它是每周一次的原因是我需要算法的数据,该算法将寻找日期作为过程的一部分。
我的问题是我希望它创建考虑到一周的分区并使用“典型”方法我必须手动创建它。像这样的。
CREATE TABLE measurement_y2013w01 (
CHECK ( logdate >= DATE '2013-01-07' AND logdate < DATE '2013-01-14' )
) INHERITS (measurement);
CREATE TABLE measurement_y2006w02 (
CHECK ( logdate >= DATE '2013-01-14' AND logdate < DATE '2013-01-21' )
) INHERITS (measurement);
...
但我希望它自动生成。我不想一个一个地为每个星期创建一个分区。
我的命名规则是 yYYYYwWW 用于分区的命名或开始 datadYYYYMMDD。
我想在插入时检查分区是这样的:
SELECT
nmsp_parent.nspname AS parent_schema,
parent.relname AS parent,
nmsp_child.nspname AS child,
child.relname AS child_schema
FROM pg_inherits
JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
JOIN pg_class child ON pg_inherits.inhrelid = child.oid
JOIN pg_namespace nmsp_parent ON nmsp_parent.oid = parent.relnamespace
JOIN pg_namespace nmsp_child ON nmsp_child.oid = child.relnamespace
如果分区不存在,则在插入之前创建它,但考虑到插入的记录数量,这会效率低下。
我的另一种选择是每周运行一个外部进程来创建此分区,但我试图避免这种情况。
是否有我缺少的更有效的解决方案,例如用于每月检查?
【问题讨论】:
-
您将有一个外部进程删除或移动旧分区,不是吗?如果是这样,它创建分区有什么问题?
-
您可能想看看 pg_partman,它可以为您自动执行许多有关分区的事情:github.com/keithf4/pg_partman/blob/master/doc/pg_partman.md
标签: sql postgresql partitioning week-number