我可以更改现有Citus表上的分配方法吗?

Eug*_*kov 5 postgresql citus

在从MySQL迁移到Citus集群期间,我使用了range分发方法.迁移已完成,但现在我想将分配方法更改为hash.

有没有办法从改变分配方法range,以hash用于在它已经数据现有的表?

我想出了以下程序,但我不确定它是否有效:

  1. 为更改的所有分片更新表的列minvaluemaxvaluepg_dist_shard
  2. 更新的碎片存储类型列pg_dist_partition从表rh
  3. COMMIT;

Ahm*_*şak 4

这是一个好问题。目前,Citus 不提供直接更改现有数据分区类型的方法。

在范围分区中,记录根据其分区列值和分片最小/最大值放置在分片中。如果记录 x 驻留在分片 y 中,则意味着y.minvalue <= x.partition_column <= y.maxvalue

在哈希分区中,对分区列进行哈希处理,并根据该哈希值路由记录。因此,您看到的最小/最大值pg_dist_shard是哈希函数结果的边界值。在这种情况下y.minvalue <= hash(x.partition_column) <= y.maxvalue

因此,进行您提到的更改最终会导致分布不正确。为了从范围分区切换到散列分区,需要重新分配数据。为此,我建议将数据重新加载到空的哈希分区表中。

有关更多信息,您可以参阅Citus 文档的使用分布式表哈希分布部分。