我的PostgreSQL数据库具有包含实体的表,这些实体可以是活动的和非活动的 - 它由isActive列值决定。很少访问非活动实体,并且随着数据库的增长,数据库的“非活动到活动”速率变得非常高。因此,我希望基于简单的isActive检查进行分区,以带来巨大的性能结果。
问题是,该表由许多其他表中的外键约束引用。正如PostgreSQL Inheritance doc的警告部分的最后一章中所指出的,这种情况没有好的解决方法。
那么,PostgreSQL中的当前分区是否仅适用于未在任何地方引用表分区的简单情况? 有没有其他方法可以优化上述表格的查询性能?我很确定我的用例很常见,应该有很好的解决方案。
创建表的查询示例:
CREATE TABLE resources
(
id uuid NOT NULL,
isActive integer NOT NULL, -- 0 means false, anything else is true, I intentionally do not use boolean type
PRIMARY KEY (id)
);
CREATE TABLE resource_attributes
(
id uuid NOT NULL,
resourceId uuid NOT NULL,
name character varying(128) NOT NULL,
value character varying(1024) DEFAULT NULL,
PRIMARY KEY (id),
CONSTRAINT fk_resource_attributes_resourceid_resources_id FOREIGN KEY (resourceId) REFERENCES resources (id)
);
在这种情况下,我想分区resources
表。
答案 0 :(得分:3)
如果非活动与活动比率非常高,则部分索引是一个不错的选择
create index index_name on resources (isActive) where isActive = 1
答案 1 :(得分:0)
为具有多个子表的表创建外键的唯一已知解决方法(我能想到)是创建另一个表来仅保存主键(但所有这些表都由触发器维护)并指向所有外键引用它。
像:
+-----------+ +----------------+ +---------------------+
| resources | | resource_uuids | | resource_part_n |
+===========+ 0 1 +================+ 1 0 +=====================+
| id | --> | id | <-- | (id from resources) |
+-----------+ +----------------+ +---------------------+
| ... | ↑ 1 | CHECK(...) |
+-----------+ +--------+ +---------------------+
| | INHERITS(resources) |
+---------------------+ | +---------------------+
| resource_attributes | |
+---------------------+ |
| resourceId | --+ *
+---------------------+
| ... |
+---------------------+
但是您仍然无法对该表进行分区(resource_uuids),因此在这种情况下,我不认为分区会对您有所帮助。