引用分区表时在PostgreSQL中进行分区

时间:2014-04-03 10:15:16

标签: postgresql partitioning database-partitioning

我的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表。

2 个答案:

答案 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),因此在这种情况下,我不认为分区会对您有所帮助。