Ruby クライアントを使用して PostgreSQL で作業しており、次のような SHA-1 ハッシュ ID でテーブルを分割したいと考えています。
id
------------------------------------------
fe935b318f6976afdec83fa7339ff2069b0bc0c3
d67948e38a645fd5ffdde6dab4dc627b2b19d1b1
0d304f5134b0a46c2248a34c3e9c50ad2b547fdf
プロセス分割では、データセットを N 個の部分に分割し、それぞれを N 個のプロセスの 1 つに割り当てます。RDBMS に整数キーがある場合は、次のように簡単です。
select * from items_to_be_processed where MOD(id, N) = ASSIGNED_PARTITION
Ryan Smithは、文字列キーがある場合、それらに CRC32 を使用して整数を取得し、次にモジュラスを取得できることを示唆していますが、キーがほとんど均等に分散されていると仮定すると (SHA-1 ハッシュの場合と同様に)、これは簡単になる?の場合N = 4
:
select * from items_to_be_processed where id < ASSIGNED_PARTITION_1
select * from items_to_be_processed where id < ASSIGNED_PARTITION_2 and id >= ASSIGNED_PARTITION_1
select * from items_to_be_processed where id < ASSIGNED_PARTITION_3 and id >= ASSIGNED_PARTITION_2
select * from items_to_be_processed where id >= ASSIGNED_PARTITION_4
たぶん、N = 2
もし
select * from items_to_be_processed where id < '8888888888888888888888888888888888888888' <- process 1
select * from items_to_be_processed where id >= '8888888888888888888888888888888888888888' <- process 2
N が与えられた場合、パーティション ポイントを計算するにはどうすればよいですか (半分に8888888888888888888888888888888888888888
分割ffffffffffffffffffffffffffffffffffffffff
しますが、正しく計算できなかった可能性があります)。SQL (Postgres) で行うべきですか、それとも呼び出しを行う Ruby クライアントで行うべきですか?
PS。MongoDB クックブックのランダム属性のアイデアに触発されました。
アップデート
888...
上記は正しく計算されませんでした-私を近づけてくれたCarl Norumの答えのおかげで、Rubyでそれを行う方法があります:
>> 'f'*40
=> "ffffffffffffffffffffffffffffffffffffffff"
>> a = 0xffffffffffffffffffffffffffffffffffffffff
=> 1461501637330902918203684832716283019655932542975
>> b = a / 2
=> 730750818665451459101842416358141509827966271487
>> '%x' % b
=> "7fffffffffffffffffffffffffffffffffffffff"
>> '%x' % (b + 1)
=> "8000000000000000000000000000000000000000"