現在、DBMS の並列処理に関する本を読んでいますが、結合操作で並列処理がどのように機能するかを正確に理解するのは難しいと感じています。
10 個のシステムがあり、各システムにはそれぞれ独自のディスク領域とメイン メモリがあるとします。たとえばデータを共有するために、システムが相互に通信できるネットワークがあります。
ここで、次の操作があるとします: A(X,Y) JOIN B(Y,Z)
テーブル A と B は大きすぎるため、全体的な計算速度を向上させるために並列処理を使用したいと考えています。
A および B テーブルの各レコードの「Y」属性にハッシュ関数を適用し、これらのレコードを別のシステムに送信します。各システムは、取得したレコードを結合するために、ローカル アルゴリズムを使用できます。
私が理解していないのは、最初のハッシュ関数が正確にどこに適用され、最初のテーブル A と B が正確にどこに格納されているのかということです。
私が読んでいる間、別の「メイン」システムがあり、それにも独自のディスクスペースがあり、このスペースにすべての初期情報、つまりすべてのレコードを含むテーブル A と B があると思いました。このシステムは、最初のハッシュ関数を適用するために独自のメイン メモリを使用しました。これにより、合計 10 個のレコードからシステムが最終的に移動して処理される場所が決定されました。
ただし、読んだときに、次の例で行き詰まりました(ギリシャ語から翻訳しました)
R(X,Y) JOIN S(Y,Z) という 2 つのテーブルがあり、R には 1000 ページ、S には 500 ページがあるとします。並列に使用できるシステムが 10 個あるとします。そのため、ハッシュ関数を使用して、各レコードの送信先を決定することから始めます。テーブル R および S を読み取るために必要な I/O の合計量は 1500 で、これはシステムごとに 150 です。各システムには、残りの各システムに必要な 15 ページのデータがあるため、135 ページを他の 9 つのシステムに送信します。したがって、通信の合計は 1350 ページです。
太字の部分がよくわかりません。システムが他のシステムにデータを送信する必要があるのはなぜですか? 前に話した「メイン」システムはこの仕事をしていませんか?
私は次のようなものを想像します:
main_system
||
\/
apply_hash(record)
||
\/
send record to the appropriate system
/ / / / / / / / / /
s1 s2 s3 s4 s5 s6 s7 s8 s9 s10
現在、すべてのシステムに独自のレコードがあり、ローカルアルゴリズムを適用して結果を出力します。システム間の通信がありません。ここで何が欠けていますか?? この本は別のアプローチを使用していますか? もしそうなら、同じユニットを3回読んでもまだ理解できないので、どのようなアプローチを使用していますか?
前もって感謝します