PostgreSQL中相关表的分区
Partitioning of related tables in PostgreSQL
我查看了文档并看了一些演示文稿,阅读了博客,但在 PostgreSQL 中找不到超过单个 table 的分区示例 - 而这正是我们所需要的。我们的 tables 是具有主从结构的仅插入审计跟踪,我们旨在解决数据删除速度慢的问题,目前使用 delete 完成。
简化结构和部分查询如下所示fiddle:https://www.db-fiddle.com/f/2mRXT4wGjM2ZSftjgKyZce/46
我现在正在研究的问题是如何有效地查询详细信息 table,无论是在 JOIN 中还是直接查询。因为 timestamp
字段是分区键的一部分,所以我知道在查询中使用它是必不可少的。我不明白为什么 JOIN 在 ON
子句中使用 timestamp
相等时无法解决这个问题(fiddle 中有几个解释示例)。
然后是更广泛的问题:
类似情况一般推荐的策略是什么?我们希望 timestamp
对我们的查询必不可少,因此将其用作分区键感觉很自然。
我做了一个简短的实验(所以还没有真正的经验)并且分区完全基于 id
范围。这似乎有一个优势 - predictable partition table sizes(或多或少,当然取决于变量列的大小)。可以在任何完整分区上添加 check timestamp ...
条件(也可以在活动分区上添加开区间 check
!),这有助于分区修剪。这有一个很好的好处,即 detail
table 只需要单列 FK 引用 master.id
(甚至可能在 JOIN 期间更好地修剪)。有类似的想法或经验吗?
我们宁愿有基于时间的分区,看起来更自然,但这不是硬性条件。将 timestamp
拖到另一个 table 及其 FK 等的需要使其不那么引人注目。
显然,我们希望两个 tables(所有,准确地说,我们将有更详细的 table 类型)沿着相同的范围划分,无论是 id
还是 timestamp
。我想不这样做会破坏分区的全部目的,因为我们将无法删除与主分区相关的数据。
我欢迎任何有关如何正确执行此操作的指示或想法。最终我们会自己决定,但现在没有多少 material 可以帮助我们做出决定。谢谢。
你的策略很好。按公共时间戳对相关表进行分区,并确保分区边界相同。
您可能没有获得有效的分区连接,因为您没有将 enable_partitionwise_join
设置为 on
。该参数默认情况下处于关闭状态,因为它会消耗大量您不想花费的查询计划时间,除非您知道自己可以从中受益。
我查看了文档并看了一些演示文稿,阅读了博客,但在 PostgreSQL 中找不到超过单个 table 的分区示例 - 而这正是我们所需要的。我们的 tables 是具有主从结构的仅插入审计跟踪,我们旨在解决数据删除速度慢的问题,目前使用 delete 完成。
简化结构和部分查询如下所示fiddle:https://www.db-fiddle.com/f/2mRXT4wGjM2ZSftjgKyZce/46
我现在正在研究的问题是如何有效地查询详细信息 table,无论是在 JOIN 中还是直接查询。因为 timestamp
字段是分区键的一部分,所以我知道在查询中使用它是必不可少的。我不明白为什么 JOIN 在 ON
子句中使用 timestamp
相等时无法解决这个问题(fiddle 中有几个解释示例)。
然后是更广泛的问题:
类似情况一般推荐的策略是什么?我们希望
timestamp
对我们的查询必不可少,因此将其用作分区键感觉很自然。我做了一个简短的实验(所以还没有真正的经验)并且分区完全基于
id
范围。这似乎有一个优势 - predictable partition table sizes(或多或少,当然取决于变量列的大小)。可以在任何完整分区上添加check timestamp ...
条件(也可以在活动分区上添加开区间check
!),这有助于分区修剪。这有一个很好的好处,即detail
table 只需要单列 FK 引用master.id
(甚至可能在 JOIN 期间更好地修剪)。有类似的想法或经验吗?
我们宁愿有基于时间的分区,看起来更自然,但这不是硬性条件。将 timestamp
拖到另一个 table 及其 FK 等的需要使其不那么引人注目。
显然,我们希望两个 tables(所有,准确地说,我们将有更详细的 table 类型)沿着相同的范围划分,无论是 id
还是 timestamp
。我想不这样做会破坏分区的全部目的,因为我们将无法删除与主分区相关的数据。
我欢迎任何有关如何正确执行此操作的指示或想法。最终我们会自己决定,但现在没有多少 material 可以帮助我们做出决定。谢谢。
你的策略很好。按公共时间戳对相关表进行分区,并确保分区边界相同。
您可能没有获得有效的分区连接,因为您没有将 enable_partitionwise_join
设置为 on
。该参数默认情况下处于关闭状态,因为它会消耗大量您不想花费的查询计划时间,除非您知道自己可以从中受益。