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

ハッシュ結合とマージ結合(Oracle RDBMS)の違いは何ですか?

    「ソートマージ」結合は、結合する2つのデータセットを結合キーに従ってソートし、それらをマージすることによって実行されます。マージは非常に安価ですが、特にソートがディスクに流出した場合、ソートは非常に高額になる可能性があります。データセットの1つにインデックスを介してソートされた順序でアクセスできる場合、ソートのコストを下げることができますが、インデックススキャンを介してテーブルのブロックの大部分にアクセスすることも、全表スキャンと比較して非常にコストがかかる可能性があります。 。

    ハッシュ結合は、結合列に基づいて一方のデータセットをメモリにハッシュし、もう一方のデータセットを読み取り、ハッシュテーブルの一致をプローブすることによって実行されます。ハッシュテーブルを完全にメモリに保持できる場合、ハッシュ結合は非常に低コストであり、合計コストはデータセットの読み取りコストよりもわずかに高くなります。ハッシュテーブルをワンパスソートでディスクにスピルする必要がある場合はコストが上昇し、マルチパスソートでは大幅に上昇します。

    (10gより前では、オプティマイザーはハッシュ結合のために最初に小さいテーブルにアクセスする必要性を解決できず、外部結合のために大きいテーブルに最初にアクセスする必要性を解決できなかったため、大きいテーブルから小さいテーブルへの外部結合はパフォーマンスの面で問題がありました。したがって、この状況ではハッシュ結合は使用できませんでした。

    ハッシュ結合のコストは、結合キーで両方のテーブルを分割することで削減できます。これにより、オプティマイザーは、一方のテーブルのパーティションの行がもう一方のテーブルの特定のパーティションでのみ一致するものを検出し、n個のパーティションを持つテーブルの場合、ハッシュ結合はn個の独立したハッシュ結合として実行されると推測できます。これには次の効果があります:

    1. 各ハッシュテーブルのサイズが縮小されるため、必要なメモリの最大量が削減され、一時的なディスクスペースを必要とする操作が不要になる可能性があります。
    2. 並列クエリ操作の場合、各ハッシュ結合を1組のPQプロセスで実行できるため、プロセス間メッセージングの量が大幅に削減され、CPU使用率が低下し、パフォーマンスが向上します。
    3. 非並列クエリ操作の場合、メモリ要件はn分の1に削減され、最初の行は以前のクエリから投影されます。

    ハッシュ結合は等結合にのみ使用できますが、マージ結合の方が柔軟性が高いことに注意してください。

    一般に、等結合で大量のデータを結合する場合は、ハッシュ結合の方が適しています。

    このトピックは、ドキュメントで非常によく説明されています。

    http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i51523

    12.1ドキュメント:https://docs.oracle.com/database/121/TGSQL/tgsql_join.htm



    1. Oracleで列挙型を使用するにはどうすればよいですか?

    2. SQLでDateTime形式から時刻を取得するにはどうすればよいですか?

    3. MariaDBでのINSTR()のしくみ

    4. PostgreSQLおよびTimescaleDB用にSELinuxを構成する方法