在 PostgreSQL 12 中,如果查询包含 child table,通过继承创建分区是否会提高查询性能?
In PostgreSQL 12, Does creating partitioning via inheritance improve query performance if queries are contained with a child table?
使用 PostgreSQL 12,我想利用分区的优势 1:有助于提高查询性能,2:允许更轻松地删除历史数据以保持减缓数据库增长。
不幸的是,声明式分区要求密钥成为 PK 的一部分。作为主键的时间字段不适用于我的模型——所以我正在探索使用继承(根据 docs)。
我的问题是,如果我的 WHERE 语句中的某个项目将结果限制为单个 child [,使用这种方法是否会类似地隔离我的 SELECT 语句将暴露的行数=35=].
例如
图书 => BooksJan2020、BooksFeb2020、BooksMar2020。
SELECT * FROM Books WHERE created < '01 20 2020' 和 author LIKE 'John%';
在声明性分区中,我希望 'LIKE' 语句只暴露给 table 一月份的行。我可以期待继承吗?在研究如何创建继承的 table 时,我没有看到一种机制可以告诉计划者从哪个 child table 中提取。
史蒂夫
您可以通过在继承子项上创建适当的检查约束并将 constraint_exclusion
保留为默认值 on
。
来做到这一点
但我想劝阻您不要在 v12 中使用声明性分区以外的任何东西。通过继承进行分区会造成伤害。此外,如果不包含分区键,您将无法获得真正的主键:即使您在所有分区上都有一个主键,也无法阻止您在不同分区中插入相同的键。
我的建议是在 (id, created)
上使用主键。诚然,这并不能保证 id
的全局唯一性,但它对实现该目标大有帮助。对于从单个序列生成的值,重复的风险很小。
复合主键的剩余缺点是您必须将两列都包含到任何 table 中,该 table 对分区 table 具有外键约束,但我会说是您为分区的优势付出的代价。此外,通过继承分区,您根本无法让外键指向分区 table。
使用 PostgreSQL 12,我想利用分区的优势 1:有助于提高查询性能,2:允许更轻松地删除历史数据以保持减缓数据库增长。
不幸的是,声明式分区要求密钥成为 PK 的一部分。作为主键的时间字段不适用于我的模型——所以我正在探索使用继承(根据 docs)。
我的问题是,如果我的 WHERE 语句中的某个项目将结果限制为单个 child [,使用这种方法是否会类似地隔离我的 SELECT 语句将暴露的行数=35=].
例如
图书 => BooksJan2020、BooksFeb2020、BooksMar2020。
SELECT * FROM Books WHERE created < '01 20 2020' 和 author LIKE 'John%';
在声明性分区中,我希望 'LIKE' 语句只暴露给 table 一月份的行。我可以期待继承吗?在研究如何创建继承的 table 时,我没有看到一种机制可以告诉计划者从哪个 child table 中提取。
史蒂夫
您可以通过在继承子项上创建适当的检查约束并将 constraint_exclusion
保留为默认值 on
。
但我想劝阻您不要在 v12 中使用声明性分区以外的任何东西。通过继承进行分区会造成伤害。此外,如果不包含分区键,您将无法获得真正的主键:即使您在所有分区上都有一个主键,也无法阻止您在不同分区中插入相同的键。
我的建议是在 (id, created)
上使用主键。诚然,这并不能保证 id
的全局唯一性,但它对实现该目标大有帮助。对于从单个序列生成的值,重复的风险很小。
复合主键的剩余缺点是您必须将两列都包含到任何 table 中,该 table 对分区 table 具有外键约束,但我会说是您为分区的优势付出的代价。此外,通过继承分区,您根本无法让外键指向分区 table。