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

标签 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 表进行分区。

最佳答案

如果不活跃与活跃的比率非常高,部分索引是一个不错的选择

create index index_name on resources (isActive) where isActive = 1

关于postgresql - 引用分区表时在 PostgreSQL 中进行分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22834510/

相关文章:

database - 如何设置 SQL Server Enterprise 进行分区

google-bigquery - 按周/月/季度/年分区以超过分区限制?

mysql - 为什么 MySQL 不使用我的分区作为索引?

sql - PostgreSQL 根据 case 语句选择列

mysql - 集群、分片或简单的分区/复制

scala - 如何定义DataFrame的分区?

SQL Server 分区 - 唯一索引错误

java - PostgreSQL 9.4,在我的 JPA namedQuery 中使用 earth_distance

ruby-on-rails - 主从暴露技术债务

postgresql - 获取函数 DDL 命令