我可以更改现有 Citus table 的分发方法吗?
Can I change the distribution method on an existing Citus table?
在从 MySQL 迁移到 Citus 集群的过程中,我使用了 range
分发方法。迁移完成,但现在我想将分发方式更改为hash
。
对于已有数据的现有 table,有没有办法将分发方法从 range
更改为 hash
?
我想到了以下程序,但不确定它是否有效:
- 更新
pg_dist_shard
table 的 minvalue
和 maxvalue
列以获取所有正在更改的分片
- 将
pg_dist_partition
table 的分片存储类型列从 r
更新为 h
COMMIT;
这是个好问题。目前,Citus 不提供直接更改现有数据分区类型的方法。
在范围分区中,记录根据其分区列值和分片 min/max 值放置在分片中。如果记录 x 位于分片 y 中,则表示 y.minvalue <= x.partition_column <= y.maxvalue
.
在散列分区中,分区列被散列并且记录根据这个散列值被路由。因此,您在 pg_dist_shard
中看到的 min/max 值是哈希函数结果的边界值。在这种情况下 y.minvalue <= hash(x.partition_column) <= y.maxvalue
.
因此,进行您提到的更改最终会导致分配不正确。为了从范围分区切换到哈希分区,应该重新分配数据。为此,我建议将数据重新加载到一个空的散列分区 table.
有关详细信息,您可以参考 Citus 文档的 Working with Distributed Tables and Hash Distribution 部分。
在从 MySQL 迁移到 Citus 集群的过程中,我使用了 range
分发方法。迁移完成,但现在我想将分发方式更改为hash
。
对于已有数据的现有 table,有没有办法将分发方法从 range
更改为 hash
?
我想到了以下程序,但不确定它是否有效:
- 更新
pg_dist_shard
table 的minvalue
和maxvalue
列以获取所有正在更改的分片 - 将
pg_dist_partition
table 的分片存储类型列从r
更新为h
COMMIT;
这是个好问题。目前,Citus 不提供直接更改现有数据分区类型的方法。
在范围分区中,记录根据其分区列值和分片 min/max 值放置在分片中。如果记录 x 位于分片 y 中,则表示 y.minvalue <= x.partition_column <= y.maxvalue
.
在散列分区中,分区列被散列并且记录根据这个散列值被路由。因此,您在 pg_dist_shard
中看到的 min/max 值是哈希函数结果的边界值。在这种情况下 y.minvalue <= hash(x.partition_column) <= y.maxvalue
.
因此,进行您提到的更改最终会导致分配不正确。为了从范围分区切换到哈希分区,应该重新分配数据。为此,我建议将数据重新加载到一个空的散列分区 table.
有关详细信息,您可以参考 Citus 文档的 Working with Distributed Tables and Hash Distribution 部分。