如何在 postgres 中集群我的 PRIMARY KEY

Posted

技术标签:

【中文标题】如何在 postgres 中集群我的 PRIMARY KEY【英文标题】:How do I cluster my PRIMARY KEY in postgres 【发布时间】:2017-10-18 14:42:09 【问题描述】:

我在 postgres 中注意到,当我们创建一个表时,它似乎会自动在 PRIMARY KEY CONSTRAINT 上创建一个 btree 索引。查看 CONSTRAINT 的属性,它似乎没有聚集。我如何集群它,我应该集群它吗?

【问题讨论】:

【参考方案1】:

你必须使用CLUSTER 命令:

CLUSTER stone.unitloaddetail USING pk10;

请记住,这会在此期间重写表并阻止其他人使用。

此外,修改表数据时不会维护集群,因此如果要保持表集群,则必须安排定期运行 CLUSTER

【讨论】:

有没有办法从 pgadmin 做到这一点? 可能。如果全部失败,您可以打开一个 SQL 窗口并输入命令。 只是一个想法,如果我必须继续重新聚集,使用索引与主键是否更有意义? @DanielL.VanDenBosch:“索引与主键”是什么意思?主键通过唯一索引强制执行。你不能有没有索引的PK 你应该使用现有的索引。额外的索引成本性能和磁盘空间。【参考方案2】:

解决“应该”部分,这取决于查询需要访问具有集群键相邻值的多行的可能性。

对于具有合成主键的表,在外键列上进行聚类可能更有意义。

假设您有一张桌子或产品。您是否更有可能要求具有以下特性的多种产品:

    连续的product_id? 相同的location_id? 相同的type_id? 同一个manufacturer_id?

如果在其中一种特殊情况下提高系统性能可以解决问题,那么这就是您应该考虑聚类的列。

如果这样做不能解决问题,那就不要这样做。

【讨论】:

经常,至少在我上面的例子中。主键几乎总是任意的。但是它们经常在JOINs 中使用。从我收集到的。将 Laurenz Albe 提供的代码用于 CLUSTER 主键似乎是个好主意。让我知道你的想法 @DanielL.VanDenBosch 是的,如果您有这样一种情况,即您为一批发票生成 20 个 invoice_line,那么您希望 invoice_line 上的主键对于单个发票是连续的。但是,发票表的 FK 将保证对于这些行是相同的,并且对该值进行聚类不仅可以提高性能,还可以更好地向系统的未来维护者展示您的意图。如果没有出现这种 PK 值的关联,就不要在上面聚类。

以上是关于如何在 postgres 中集群我的 PRIMARY KEY的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的一些 kubernetes 节点无法连接到我的 postgres 集群而其他节点成功?

如何在 Heroku 中将 Kafka 连接到 Postgres

如何判断 Postgres 表何时聚集以及使用了哪些索引

“检查指针进程”在 Postgres 中消耗更多内存。如何控制它?

初始化集群 Postgres-XL

Postgres XL 将数据节点添加到现有集群