在PostgreSQL 12中,如果查询包含在子表中,通过继承创建分区是否会提高查询性能?

在PostgreSQL 12中,如果查询包含在子表中,通过继承创建分区是否会提高查询性能?,postgresql,postgresql-12,Postgresql,Postgresql 12,使用PostgreSQL 12,我想利用分区来1:帮助查询性能,2:允许更轻松地删除历史数据以保持数据库增长 不幸的是,声明性分区要求密钥是PKs的一部分。作为主键的时态字段对我的模型不起作用-因此我正在探索使用继承来代替 我的问题是,如果WHERE语句中的某个项将结果限制为单个子表,那么使用这种方法是否会类似地隔离SELECT语句将要暴露的行数 例如 Books=>BooksJan2020、BooksFeb2020、BooksMar2020 从“01 20 2020”和“John%”等作者创建

使用PostgreSQL 12,我想利用分区来1:帮助查询性能,2:允许更轻松地删除历史数据以保持数据库增长

不幸的是,声明性分区要求密钥是PKs的一部分。作为主键的时态字段对我的模型不起作用-因此我正在探索使用继承来代替

我的问题是,如果WHERE语句中的某个项将结果限制为单个子表,那么使用这种方法是否会类似地隔离SELECT语句将要暴露的行数

例如

Books=>BooksJan2020、BooksFeb2020、BooksMar2020

从“01 20 2020”和“John%”等作者创建的书籍中选择*

在声明性分区中,我希望'LIKE'语句只对表中的行公开。我能期望继承也一样吗?在研究如何创建继承表时,我没有看到一种机制可以告诉规划器从哪个子表中提取


SteveJ

您可以通过在继承子项上创建适当的检查约束,并将constraint_exclusion保留为其默认值

但我想劝阻您不要在v12中使用声明性分区以外的任何东西。通过继承进行分区是有害的。此外,对于不包含分区键的任何对象,都无法通过这种方式获得真正的主键:即使在所有分区上都有主键,也没有什么可以阻止您在不同分区中插入相同的键

我的建议是在id上使用主键,即created。诚然,这并不能保证id的全局唯一性,但它在实现这一目标方面还有很长的路要走。对于从单个序列生成的值,重复的风险是微乎其微的


复合主键的另一个缺点是,您必须将这两个列都包含到任何对分区表具有外键约束的表中,但我认为这是您为分区优势付出的代价。此外,使用继承分区时,外键根本无法指向分区表。

我认为这正是不应该使用继承进行分区的原因more@Bergi; 除此之外,不幸的是,分区充满了限制,使其用例受到限制。它必须是pk的一部分,pk列上的唯一约束必须包括分区键,这是一个主要示例。