【发布时间】:2013-03-05 09:15:44
【问题描述】:
我想知道这是否可能(以及如何去做)
在 postgres 9.1 中根据日期字段是否为空来对表进行分区。
非常有效,我有一个表,它变得非常大,我有一个“delete_on”日期,当项目被删除时,它们只会被标记为已删除。
这将是归档它们并保持活动表较小的理想选择。
我在考虑一个表分区,只是有类似的东西
活动(delete_on = NULL)
存档(deleted_on != NULL)
然后,当我对记录进行更新并将其设置为删除时,它将被写入存档表。
我可以手动完成,只需创建两个单独的表并编写代码来复制数据,但如果我可以直接将它放在数据库中,我会喜欢它。
有什么想法吗?
编辑:
主表
CREATE TABLE my_table (
id int not null,
deleted date not null,
number1 int,
number2 int
);
分区
CREATE TABLE my_table_active (
CHECK (deleted IS NULL)
) INHERITS (my_table);
CREATE TABLE my_table_archive (
CHECK (deleted IS NOT NULL)
) INHERITS (my_table);
触发函数
CREATE OR REPLACE FUNCTION my_table_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
IF ( NEW.deleted IS NULL ) THEN
INSERT INTO my_table_active VALUES (NEW.*);
ELSE
INSERT INTO my_table_archive VALUES (NEW.*);
END IF;
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
创建触发器
CREATE TRIGGER insert_my_table_trigger
BEFORE INSERT ON my_table
FOR EACH ROW EXECUTE PROCEDURE my_table_insert_trigger();
(我从 Postgres 文档中获取了以上内容)
如果您要对活动表中已经存在的字段进行更新,这将如何工作?
所以我在活动表中有一条记录(即删除为空),然后我将该记录设置为删除(通过给它一个日期戳)。那时我希望它移动到存档表。
【问题讨论】:
-
那么状态要么是 NULL(即为空或未设置)要么是日期(记录被删除的日期),所以它在技术上不是布尔值。但是,更多地考虑这个问题我在想我什至需要打扰分区吗?使用 deleted_on 日期设置的记录越多,那么我只需优化我的查询以仅搜索已删除为 null 的记录,这不会使查询规划器只检查较小的记录集吗?