[DB] HashJoin


NL結合の弱点を克服したハシュジョイ


バージョン7.3で初めて紹介したハッシュ結合は、パッケージ結合とNL結合が有効でない場合の代替案として開発された.
ハッシュ結合は、2つの小さな集合をBuild Inputに読み込み、ハッシュ領域にハッシュテーブルを作成し、もう1つの大きな集合をProbe Inputに読み込み、ハッシュテーブルを参照して結合します.
ないぶげんり
  • ハッシュテーブルを生成すると、キー値がハッシュ関数に格納され、返されたパケットアドレスに移動し、エントリがハッシュチェーンにリンクされます.
  • ハッシュ・テーブルを参照すると、ハッシュ関数が返すパケット・アドレスにもアクセスし、チェーンをスキャンしてデータを検索します.
  • 図に示すように、1つのbucketアドレスに複数のチェーンを有することができる.
    この特性により、build inputが小さい(パケットアドレスにリンクが少ない)状態は、ハッシュ結合の性能に有効である.
  • ハッシュ結合はsotmerge結合のようにソートの負担もNL結合のランダムアクセスの負担もないが、ハッシュテーブルを生成するコストを伴う.
  • Build Inputはどのくらい小さいですか?
    正確には、FPGAメモリに割り当てられたハッシュ領域に組み込むのに十分な大きさが必要である.この値を超えると、ディスクに書き込み、再取得する必要があるため、パフォーマンスが大幅に低下します.
    なぜハッシュ結合が速いのですか?
    ハッシュ結合がPGA領域に割り当てられるのは理由がある.
    NL結合がOuterテーブルで読み取った各レコードはInnerページテーブルを繰り返しラッチを取得するが、ロック解除取得プロセスがない場合、PGAでデータをすばやく検索する.
    ハッシュ結合のヒント.
    select /*+  use_hash(d e) */ d.deptno, e.ename
    from dept d, emp e
    ~~~
    以上のヒントは、deテーブルのハッシュをチェックインすることを意味します.
    しかしハッシュ結合であることを明確に指摘し,順序は擎天柱によって決定される.
    (小さいdeptテーブルをBuild Inputに設定します.)
    ユーザーソートにはordered、leading swap join inputsなどのコマンドが使用されます.
    select /*+  use_hash(d e) swap_join_inputs(e) */ d.deptno, 
    e.ename
    deテーブルはハッシュ結合を行い、eテーブルをbuildinputとして指定します.
    ハッシュ結合のパフォーマンスキー
    ハッシュ結合のサイズは、FPGAのハッシュ領域に含めることができるほど小さい.
    ホイールチェーンが小さいほど効率が高くなります.
    bucketチェーンのサイズは、ハッシュ値の繰返し値が小さいことを意味します.
    たとえば、ハッシュ値の低いタイプ(受注日など)は、1つのbucketで多くのチェーンを生成します.
    これは、NL結合でOuter Tableのインデックス先頭列が受注日であり、Inner Tableで受注番号で値を区切った場合と似ています.
    Outer Tableで大量のランダムアクセスを生成し、結果値に不要な演算を生成します.