sql >> データベース >  >> RDS >> Oracle

例を使用してOracleでハッシュ結合

    目次

    Oracleのハッシュ結合とは何ですか?

    ハッシュ結合は、大きなテーブルを結合する場合、または結合で結合されたテーブルの行のほとんどが必要な場合に使用されます。これは、等式結合にのみ使用されます

    Oracleハッシュ結合のアルゴリズム

    1)オプティマイザーは、2つのテーブルのうち小さい方を使用して、メモリ内にハッシュテーブルを構築します。小さなテーブルはビルドテーブルと呼ばれます

    ビルドフェーズ

    小さなテーブルループの各行について
    結合キーのハッシュ値を計算します
    適切なハッシュバケットに行を挿入します。
    ループを終了します;

    2)次に、大きなテーブルをスキャンし、(大きなテーブルの行の)ハッシュ値をこのハッシュテーブルと比較して、結合された行を見つけます。大きなテーブルはプローブテーブルと呼ばれます

    プローブフェーズ

    大きなテーブルループの各行について
    結合キーのハッシュ値を計算します
    ハッシュ値のハッシュテーブルをプローブします
    一致が見つかった場合
    行を返します
    ループを終了します;

    上記の説明は、開発中のハッシュテーブルが完全にメモリに収まる場合に当てはまります。ハッシュテーブルが大きすぎて使用可能なメモリに収まらない場合、Oracleは少し異なる方法で処理を行います。
    基本的に、ハッシュテーブルが使用可能なメモリに収まらないほど大きいOracleには、ディスクにバッチ(パーティションと呼ばれる)で保存し、プローブテーブルを一致するバッチでディスクに保存してから、一致するバッチ間で区分的に結合するメカニズムがあります。

    基本的に、ハッシュ領域がいっぱいになると、OracleはTEMPテーブルスペースを使用する必要があります。 Oracleは、ハッシュ内で最大のパーティションを選択し、それをTEMPに書き込みます。Oracleは、ハッシュテーブル全体のビットマップのようなインデックスをメモリに保持します。このインデックスは、特定のハッシュバケット(ハッシュテーブル内の場所)に値があるかどうかだけを認識します。ただし、インデックスには実際の値がありません。

    したがって、2番目のテーブルまたはプロービングテーブルの行がこれらの場所の1つにハッシュされる場合、既知の唯一のことは、潜在的な一致があることです。ハッシュテーブルを構築するプロセスは、ハッシュテーブル全体が完了するまで続きます。ハッシュテーブルの一部はメモリ内にあり、一部はディスク上にあります

    これで、Oracleはプローブまたは他のテーブルの読み取りを開始し、結合キーのハッシュの作成を開始します。ハッシュキーがメモリ内のハッシュと一致する場合、結合が完了して行が返されます。行が一致する可能性がある場合は、oracleこの行は、最初の行のデータが保持されていたのと同じパーティションスキームのTEMPテーブルスペースに格納されます。

    セカンダリテーブル全体の最初のパスが完了し、メモリ内のハッシュテーブルのすべての行が指定されると、Oracleはディスク内の一致するパーティションの検索を開始し、各パーティションを1つずつ処理して、メモリ内の行を読み取ります。出力を処理します

    ハッシュ結合Oracleの例:

    select /* +use_hash( a b) */ a.emp_no,b.dept_no,b.dept_name from emp a,dept b where a.dept_no=b.dept_no;
    Plan
    -------------------------------------------------
    SELECT STATEMENT
    HASH JOIN
    TABLE ACCESS FULL EMP
    TABLE ACCESS FULL DEPT

    Oracleでのハッシュ結合の処理方法
    1)最初のEMPテーブルがスキャンされてハッシュされます
    2)deptテーブルが行ごとにスキャンされ、dept_noを保持する結合用にハッシュが作成されます
    3)dept_noハッシュがハッシュテーブルで一致します、一致するものが見つかった場合、結合された行が返されます

    oracleハッシュ結合のヒント

    Oracleは、ハッシュ結合の使用を強制するためのヒントuse_hashを提供しています。

    Usage
    
    select /* +use_hash(table alias) */ ......
    

    これは、「table_alias」が結合順序の次の行ソースである場合に使用される結合メソッドがハッシュ結合である必要があることをオプティマイザに通知します。ただし、その行ソースをビルドテーブルとして使用するかプローブテーブルとして使用するかはオプティマイザに通知されません。

    行ソースの使用方法を指定するには、2番目のヒントが必要です。Oracleで行ソースをプローブテーブルとして使用する場合はno_swap_join_inputs( "table_alias")、Oracleでビルドとして使用する場合はswap_join_inputs( "table_alias")テーブル

    Oracleでのハッシュ結合に関するいくつかの重要なポイント

    1)ハッシュテーブルの構築時にハッシュ結合がブロックされるため、ハッシュ結合の結果の出力は瞬時ではありません。ハッシュテーブルの構築が完了すると、行がより速く返されます
    2)ハッシュ結合はALL_ROWSオプティマイザで一般的に見られますモード。これは、少なくとも1つのテーブルのすべての行がハッシュテーブルでハッシュされた後に結果を表示するモデルで機能するためです。
    3)ハッシュテーブルはプライベートメモリであるため、データへのアクセスに多くのラッチアクティビティが発生することはありません。

    ハッシュ結合のコスト =テーブルAの読み取りのコスト+読み取りテーブルBのコスト+メモリ内のわずかな処理

    ネストされたループとハッシュ結合の違い

    ハッシュ結合 ネストされた結合
    ハッシュ結合は、大きなテーブルを結合する場合、または結合で結合されたテーブルの行のほとんどが必要な場合に使用されます。これは、等式結合にのみ使用されます NESTED LOOPS結合は、選択された開始行ソースから行を選択し、この行ソースの値を使用して、一致する行を検索する結合行ソースにドライブまたは選択する結合操作です。
    -OLTPタイプのトランザクションに最適
    多くのレコードが返される場合、通常、ハッシュ操作は2つのデータセットに対して効率的です。 1つのデータセットに返されたレコードがないか少数であり、インデックス操作を使用して他のデータセットを照合できる場合は、ネストされたループ結合の方が効率的です
    ALL_ROWSオプティマイザーモードで使用されるハッシュ結合が増える可能性があります。これは、少なくとも1つのテーブルのすべての行がハッシュテーブルでハッシュされた後に結果を表示するモデルで機能するためです。 FIRST_ROWSオプティマイザーモードを使用すると、フェッチされた瞬間の結果をユーザーに表示するモデルで機能するため、ネストされたループの使用が増えます。データがユーザーに返される前に、データのキャッシュを選択する必要はありません。ハッシュ結合の場合は必要であり、以下で説明します。

    1. SQL Server2014CTP1用の新しいVMを準備します

    2. SQLServerの日時フィールドのデフォルト値をタイムスタンプに追加します

    3. Oracleでのページネーションのベストプラクティスは?

    4. 死ぬことのないゾンビPerfMonカウンター!