ハッシュのPostgreSQLとGreenplumは包括的に解釈しよう

2019年10月15日、ピボタル中国R&Dセンターの副社長とGreenplumは中国のコミュニティスポンサー八尾Yandongは、PostgreSQLの会議ヨーロッパに出席イタリアで開催され、「どのようにハッシュは、PostgreSQLおよびその誘導体で作業に参加しない」素晴らしい演説を行いました。彼らは交換を学習するために、この記事によると、スピーチから集まりました。

今日、私の意志の詳細PostgreSQLとGreenplumはのハッシュ結合。ハッシュ結合が重要な武器や分析処理のOLAPクエリ(分析クエリ)のであるから、このトピックハッシュ結合を選択する理由。まずは、ハッシュ結合でのPostgreSQLを見ては達成みましょう。

ハッシュ結合が達成導入する前に、最初に登録しようされているものを理解しています。ウィキペディア(ウィキペディア)によれば、リレーショナルデータベースまたは表オペレータの列の複数の組み合わせであるJOIN。

そして、SQL標準定義INNER JOINは、LEFT JOINは、RIGHT JOINの結合の多くの種類があり、FULL OUTERは、操作が非常に簡単に理解することがある集合論で、4種類を登録しよう。私たちは、JOINユーティリティのこれら4種類の直感的な説明は下記の図。

ここで、例えば、付加型のJOIN SEMIとアンチJOIN JOIN。どちらのSQL構文ではありません、JOIN、しかし、一般的に、特定のSQL関数を達成するために使用される、彼らは後に詳述します。

これは、本明細書のそのような例を使用します。二つのテーブルが含まれ例:生徒のスコアテーブルとテーブルには、各テーブルには、レコードの数を持っています。

まず、対応するSQLの図は、JOINステートメント参照してください。あなたは説明を経由しての例を、SQL JOINの6種類を表示することができます。(セットenable_mergejoinする必要があり、enable_hashaggがOFFになっている、そうでない場合は、オプティマイザが異なるクエリプランを選択する場合があります)

ショーの結果下記の図は、私たちは、JOINの図の役割の直感的な意識を持ってみましょう。

JOINの3個の古典的なアルゴリズムがありますネステッド・ループ、マージは、ハッシュ結合、参加します。彼らは一般的に、このような悪いネストループ性能などの利点と欠点を持っていますが、JOINの任意のタイプに適用されます。マージは、事前仕分けデータのパフォーマンスのは非常に良いです参加し、データのハッシュ結合大量は、通常、最高のパフォーマンスであるが、唯一の等価結合を扱うことができ、かつこのようC1を扱うことができない> c2は、このような条件に参加します。

ハッシュ結合は、2つのフェーズを含む古典的なアルゴリズムである、ビルドが相、理想的に構築されたハッシュテーブルの小さなテーブルであり、テーブルは一般に、内側テーブルと呼ばれ、第二相のプローブ相、別のスキャン関連行が検出することによってハッシュテーブルをマッチングおよび/タプルが存在するかどうか、コンテンツのテーブルは、このテーブルは、通常、外側テーブルと呼ばれます。

インナーとレッツ・スタートが開始するために参加します。インナーの例の参加があり、以下の図は、そのクエリプランは、右の計画は、グラフィカルツリーである左。前記内側テーブルはまた、一般右テーブルと呼ばれ、外側テーブルが左テーブルと呼ばれます。

最初のビルドフェーズは、この段階では、内部テーブルのスキャンの各タプルに対して、に基づいてハッシュ値を計算するキー、およびハッシュテーブルのバケット内の対応する場所に参加します。内部テーブルをスキャンした後、また、全体のハッシュテーブルの構築を完了しました。

第二段プローブ相、外側テーブルスキャンのタプル(組)のそれぞれは、タプルのハッシュ値と、外側テーブルを算出したハッシュ値を計算し、ハッシュテーブルマッチングタプルかどうかを確認し、もしそしてすべてのクエリ条件を満たさなければならない、タプルが出力されます。順次各外側テーブルタプルを処理します。

次の例では、今内部結合とは異なる、完全外部ジョインなり一致するタプルを対処しない方法です。依然としてビルドハッシュテーブルに内部テーブルをスキャンし、その後、外側テーブルをスキャンします。キーマッチに参加して、すべてのクエリ条件を満たしている場合、相関結果に対応するタプルが出力されます。ハッシュテーブルないマッチングタプル場合、タプルが出力され、かつヌル相関結果テーブルは、内側列に対応して充填されています。スキャンは、外側テーブルを終了すると、すべてのマッチは、内側タプルを持っていなかった見つけるタプルを出力し、再度ハッシュテーブルをスキャンし、外側テーブルの列に対応するヌル相関結果が充填されています。

ここでは比較的混乱場所です:SQLの内部型は意味論と実装タイプのJOIN、JOIN。私たちは例を見て、同じ2つのSQL LEFTは内部使用ハッシュ左のJOIN JOINまたはハッシュ右参加します。最初の例は、小さなテーブルを結合左大きいテーブルであり、その内部が達成される参加左入力JOIN、大きなテーブルを結合する左の第二の例では、小さいテーブルであり、内部実装のタイプである右ジョインJOIN。その理由は、ハッシュテーブルのその構成された、できるだけオプティマイザ低いテーブルでテーブルを作成することです。

私たちは半参加を見てみましょう。セミ通常EXISTS実装するために使用されて参加します。これは、内部結合に似ている、唯一の半異なるサポートが一致するものではないタプルが一致してどのように多くの上、存在しない懸念している参加します。

アンチEXISTS、NOT実装するための出力時に一致するタプル、ある登録しよう。

メモリへの内部テーブルには、どのように多くを行うことができない場合:非常にエレガントかつ直感的な、しかし、問題は考えられないフロントルックスを実現しますか?アイデアは、古典的な分割統治を解決することです。猶予ハッシュが、この問題を解決するための古典的なアルゴリズムである参加:それは複数のパーティションに関連付けられたキーに応じて、内側テーブルと外側のテーブルであり、各パーティションは、ディスクに保存、ハッシュアルゴリズムは、次に挙げる各パーティションの先頭に適用される加入します。バッチ(第一バッチ)に各パーティション。基本的な考え方は、キーの参加応じたハッシュ値が、ハッシュ値の計算とを計算することで対応するbatchno bucketno:アルゴリズム:

  • bucketno =ハッシュ値MOD nbuckets

batchno =(ハッシュ値のDIVのnbuckets)MOD nbatch

  • nbucketsはバケットの数、nbatchバッチ番号、2の累乗であり、双方は、このようにビット操作bucketnoとbatchnoによって得ることができます

ハイブリッドハッシュは、最適化に参加する参加猶予ハッシュのトップである:最初のバッチは、ディスクIOの最初のバッチを回避するために、ディスクに書き込まれている必要はありません。

ハイブリッドハッシュタプルバッチ属している場合、以前は、batchnoを計算アルゴリズムによれば、内側テーブル最初のパーティション/サブバッチに参加する
それ以外の場合は、バッチを対応するディスクファイルに書き込まれ、0は、メモリのハッシュテーブルが追加されます。バッチ0はディスク・ファイルに書き込まれません。

次いで、外側テーブルパーティション/分BATCH、タプルの外側のテーブルは、バッチ0に属している場合、ハッシュ結合前述のアルゴリズムが実行される。本どこすべての条件が満たされている場合、内側タプルハッシュテーブルアウタータプルのマッチが存在するかどうかを決定します、我々は試合、出力を発見した、または次のタプルに進みます。外側のタプルはバッチ0属していない場合は、バッチを、対応するディスク・ファイルに書き込まれます。

スキャン、バッチ0の終わりも完成し、処理されている外部テーブル。処理は、バッチ1続け:一時メモリにテーブルデータの1内側ロードバッチを、ハッシュテーブルを構築し、次にスキャンテーブルバッチアウター1つの一時的なデータ、実行以上の動作は、プローブにジャンプ。バッチ1が完了すると、処理は、すべてのバッチまで、バッチ2を継続します。

以下、このグラフは、バッチの複数のかどうかを決定する方法について説明:内部テーブルのサイズとオーバーヘッドは、単一のバッチを使用して、より少ないバケットはwork_memよりもあれば、そうでない場合はバッチの複数の使用を必要とします。

アルゴリズム入力:

  • Plan_rows:内部表の行の推定数
  • Plan_width:内部表の推定平均線幅
  • NTUP_PER_BUCKET:単一のバケットのデータの組、この値は10古いバージョンであり、新しいバージョンは、タプルを含む平均Aバケットにハッシュ衝突は稀であると仮定すると、1であります
  • Work_mem:ハッシュ結合のためのクォータのメモリ割り当て

バッチ0がまだ大きすぎるので、十分なメモリはどのように行うために対応するために?

アプローチは、バッチの数を倍増することであるから、nは2Nになります。0は、再度スキャンするバッチをタプルの内部に、2Nのバッチが新しいタプル対応バッチに書き込まれ、メモリに保持され、又はメモリから除去され、依然として0である場合、それは、属するバッチに応じて再計算しました。

この時点でタプルは、バッチの処理が処理されるとき、バッチファイルを移動しません。

バッチ変更の数としては、タプル内のいくつかのバッチは、現在のバッチに属していてもよいです。ハイブリッドハッシュは、バッチの数を2倍にした後、バッチタプルが前進せずだけ後方に属することを確認するためのアルゴリズム(モジュロ演算)に参加します。

バッチを処理する際のバッチのあまりに多くの内側のタプルは、あまりにも多くのスペースを占有している場合、私は、メモリがまだフィットしている可能性があります。

これは、バッチが続くの数を2倍になります。図に示すように。

タプルのbatchnoバッチはまた、電流を変更属します。具体的な例として、Nbatch = 10を想定し、2倍にした後、Nbatch = 40;バッチを既に3タプル満たすハッシュ値%10 = 3で、ハッシュ値のバッチ3タプル3、13、23とすることができるので、33 、43、53、10 nbatchが40から変更されたとき...、ハッシュ値40%は、3、13、23、33の結果であり得ます。

古典的なハイブリッドハッシュの上に実装PostgreSQLのハッシュ結合は、いくつかの最適化を行うにも参加し、最適化は、傾きデータの重要な最適化です。PETのような現実のデータの多くは非正規分布は、地球上の誰もが大多数を占めるだろう、ペット、猫や犬を持っていると仮定されます。

データ一括0段階で最も一般的な(MCV、ほとんどの一般的な値)の外側のテーブルを処理:スキューは、コアアイデアはioのディスクを回避しようとすることで最適化されています。理由MCV MCVではなく、外側のテーブルの内部テーブルは、通常、正規分布表を行い、この外側のテーブルがさらに大きくなり、あるいは非正規分布の大きい確率になる小さなテーブルと内部テーブルを選択し、選択を最適化することです。

最初の3つのステップを備え、スキューハッシュテーブルを用意し:

  • スキューハッシュテーブルのサイズを決定します。2%のデフォルトの割り当てPostgreSQLユーザビルドメモリスキューハッシュテーブル、および多くのMCVのタプルを収容することができますどのように計算します。
  • もしpg_statistic syscacheデータは、MCVのそれぞれについて、算出されたハッシュ値を統計のMCV外側のテーブルを取得し、対応するスキューハッシュバケット内の場所をので、バケット点そのNULLに、何の処置内部テーブルは存在しません。現在のスロットが占有されている場合は、ハッシュ衝突の解決には、次のを取る、直線的な成長です。サイズのためのスキューバケットを計算し、我々は革命を避けるために、スキューハッシュテーブルスパース十分に予備スロットを見つけることができなかったことを保証します。
    • スキューハッシュテーブルを充填:現在のタプルがスキューハッシュテーブルを属している場合、スキャン内側テーブル構築メインハッシュテーブル、(スロットが空でない場合に相当)には、スキューハッシュテーブル主ハッシュテーブルに追加されません。

スキャン外側テーブル、MCVタプル、スキューハッシュテーブルを処理するために使用されている場合。そうでなければ、ハイブリッドハッシュによるアルゴリズム処理は前述した参加。スキュー最適化を仮定すると、バッチ0でMCVsステージプロセスの50%は、その後、ディスクIOの約50%保存します。

ここでは、JOINの平行主にPostgreSQLのハッシュ結合がエレガントに見える達成参加平行、並列ハッシュ内のコードの処理の約1倍の量を導入参加しません。そして、Greenplumは参加並列ハッシュを処理するための非常にエレガントなソリューション、コードのほとんど変化しています。

次に、の取得Greenplumはハッシュ結合でみましょう。

最初は、Greenplumはに導入しました。多くのPostgreSQLのGreenplumは自然のクラスタノードは、しかし、唯一のPostgreSQLの多くのノードが一緒に、使用者は、透明性を提供する論理データベースACIDを満たすことができます。

フル機能の分散ファイルシステムでのGreenplumはチーム、分散クエリの最適化終了、分散実行、メモリ、トランザクション管理、同時実行制御、クラスタ管理や他の分野の仕事の多くはその、高性能、リニアなスケーラビリティをユーザに提供し、論理データベース。

これは、Greenplumは典型的なトポロジーです。GreenplumはCSの
モード、両方のマスターセグメントノードは、各ノードが自ストレージ、メモリおよび演算ユニットを有している、との間のネットワークを介して通信し、このアーキテクチャはまた、非共有アーキテクチャMPPと呼ばれます。ディスク、セグメント、ネットワークマスターから全体構造
などすべてのレベルは、非常に入手可能です。

Greenplumは二つの重要な概念があります。

  • 配布戦略:そのセグメントに記憶された各タプルを制御する、現在ハッシュ分散、ランダムに分布し、複製テーブル、ならびにカスタムをサポート
  • モーション:収集し、再配布と放送:異なるセグメント間でデータを転送する、3つの方法があります

内部の二つの表の分散キー例SQLの例は、動作は、機械で行うことができ、その後、結果の概要の動きマスターを収集しない参加するので、IDの学生です。こののPostgreSQLとSQLの実行
クエリの実行は非常に似ています。

この場合、異なるセグメントに学生ID分散データに応じて、学生テーブル、ID分布データに応じたスコアシートは、異なるセグメントにシートをスコアつつ同じ学生は、情報は異なるノード上に分散させることができるスコアことページピクチャ問い合わせようこのプログラムは不正な結果を生成します。この問題を解決するために、クエリプランは、ブロードキャストの動きを紹介します。外側のノードをブロードキャストするようなハッシュ結合ノードがノード運動で、データの総量は、結果が正しいハッシュ結合であることを保証するために、外側のテーブルで得ることができます。

この画像は、SQLの実行フローのページを示しています。等の詳細についてスライス、ギャング、について、あなたは出版Greenplumはチームを参照することができ、「Greenplumは:達成するためのビッグデータ戦略から。」

GreenplumはとPostgreSQLハッシュ結合は、同様の達成します。機能強化作られたいくつかのポイントがあります。

  • サポートは、zstd圧縮アルゴリズムを使用するので、圧縮と解凍速度と優れたバランスをしている間に、圧縮比のための一時的なバッチファイル、zstdを圧縮します
  • 左反半は、NOT INシーンの種類を最適化するために、追加参加します。
  • 実装レベルハッシュ結合で見えるシングルノード平行PostgreSQLとGreenplumはデータベースハイブリッドハッシュアルゴリズムに参加基づいて、アクチュエータ・レベルの実装の詳細少し異なる、主な変更は、オプティマイザレベルということです。並びにそのようなCitusDBなどの他の並列データベース。

この記事では、コードの可能詳細な限り必要ですが、明確なHahsjoinロジックを達成するための論理レベルから話すことはありません。あなたが興味を持っている場合は、コードを参照することができます。私たちは、処理ロジックは、コードが比較的簡単に見えることを理解しました。そして、対応するコードnodehash.cのnodehashjoin.c

メインコード論理execHashJoin()関数の実装6つの主要な状態、図に示すように、実質的に状態遷移を有する状態機械、。、参考値。

リリース6元記事 ウォンの賞賛0 ビュー48

おすすめ

転載: blog.csdn.net/gp_community/article/details/104778618