我注意到集群可能需要很长时间并完全锁定表,即使是读取也是如此。
Index Organized Tables 和 incremental clustering 会是完美的,但遗憾的是 PostgreSQL 不支持它们。
现在我意识到它也锁定了副本的表,所以显然没有办法在没有大量停机时间的情况下进行集群?
在主实例和副本实例上设置rds.logical_replication
为1
都没有帮助。
我想每周聚集四张大桌子以获得更好的性能。
我注意到集群可能需要很长时间并完全锁定表,即使是读取也是如此。
Index Organized Tables 和 incremental clustering 会是完美的,但遗憾的是 PostgreSQL 不支持它们。
现在我意识到它也锁定了副本的表,所以显然没有办法在没有大量停机时间的情况下进行集群?
在主实例和副本实例上设置rds.logical_replication
为1
都没有帮助。
我想每周聚集四张大桌子以获得更好的性能。
在表被 CLUSTERED(或 VACUUM FULL)时让查询对表进行操作的一个问题是,即使从用户的角度来看仅选择的查询仍然可以以用户不可见的方式写入表,以设置提示位例如,在回滚事务后进行清理。
您可以设置两个副本,一个在表集群操作开始之前暂停重放,因此在 CLUSTER 期间对读者开放,另一个允许正常重放。然后一旦 CLUSTER 完成,每个人都从暂停的副本切换到另一个副本,以便暂停的副本可以赶上。不过,您是否可以容忍使用落后数小时的副本是另一个问题。
有些项目将对表进行在线集群,例如 pg_reorg 和pg_repack。它们不是 PostgreSQL 核心的一部分,但它们可能值得一看。我没有在生产中使用它们,但主要是因为我对它们没有生产需求。
另一种选择是对表进行分区。然后每个分区可以单独重新聚类,如果分区约束完成与聚类相同的事情——为部分扫描生成更有效的 IO 模式,则您可能根本不需要进行聚类。