2016-04-28 2 views
5

MySQLからCitusクラスタへの移行中に、私はrange配布方法を使用しました。移行は完了しましたが、今は配布方法をhashに変更したいと思います。既存のCitusテーブルの配信方法を変更することはできますか?

すでにデータが入っている既存のテーブルについて、配信方法をrangeからhashに変更する方法はありますか?

私は、次の手順を思い付いたが、それは有効なのですかわからない:

  • 更新シャード・ストレージ・タイプの列を変更され、すべての破片のためのpg_dist_shardテーブルのminvaluemaxvalue

    1. 更新rからh
    2. COMMIT;
    からpg_dist_partitionテーブルの
  • 答えて

    4

    これは良い質問です。現在、Citusは既存のデータのパーティションタイプを直接変更する方法を提供していません。

    範囲パーティション化では、パーティション列値とシャード最小/最大値に従ってレコードがシャードに配置されます。レコードxがシャードyにある場合は、y.minvalue <= x.partition_column <= y.maxvalueを意味します。

    ハッシュパーティショニングでは、パーティション列がハッシュされ、このハッシュ値に従ってレコードがルーティングされます。したがって、pg_dist_shardに表示される最小値/最大値は、ハッシュ関数の結果の境界値です。この場合y.minvalue <= hash(x.partition_column) <= y.maxvalue

    したがって、上記の変更を行うと、正しく配布されなくなります。範囲パーティションからハッシュパーティションに切り替えるには、データを再配布する必要があります。これを行うには、空のハッシュ・パーティション表にデータを再ロードすることをお勧めします。

    詳細については、CitusドキュメントのWorking with Distributed TablesおよびHash Distributionセクションを参照してください。

    +0

    shardテーブルを同じminvalue/maxvalueに更新すると、 'hash(x.partition_column)'が各シャードに当たってプランナが各シャードにクエリをルーティングするので、すべてがうまく動作することを確認できますか? –

    +0

    データをリロードすることはできません。数日かかるでしょう...私は、計画者がcitusメタデータをどのように使用しているかについてのDOCを見てうれしく思います。 –

    +1

    各シャードの最小値をINT_MINに、最大値をINT_MAXに設定すると良いでしょう。これは、SELECTクエリでは動作しますが、シャードプルーニングが行われないため、処理が遅くなります。ただし、問合せの変更(INSERT、UPDATE、DELETE)は、問合せごとに1つのヒットを想定しているため動作しません。 このソリューションは、単にCitusを動作させることで肯定的ですが、パフォーマンスの比較や制作のためには、データをゼロからロードすることを強くお勧めします。 –

    関連する問題