「ソートマージ」結合は、結合する2つのデータセットを結合キーに従ってソートし、それらをマージすることによって実行されます。マージは非常に安価ですが、特にソートがディスクに流出した場合、ソートは非常に高額になる可能性があります。データセットの1つにインデックスを介してソートされた順序でアクセスできる場合、ソートのコストを下げることができますが、インデックススキャンを介してテーブルのブロックの大部分にアクセスすることも、全表スキャンと比較して非常にコストがかかる可能性があります。 。
ハッシュ結合は、結合列に基づいて一方のデータセットをメモリにハッシュし、もう一方のデータセットを読み取り、ハッシュテーブルの一致をプローブすることによって実行されます。ハッシュテーブルを完全にメモリに保持できる場合、ハッシュ結合は非常に低コストであり、合計コストはデータセットの読み取りコストよりもわずかに高くなります。ハッシュテーブルをワンパスソートでディスクにスピルする必要がある場合はコストが上昇し、マルチパスソートでは大幅に上昇します。
(10gより前では、オプティマイザーはハッシュ結合のために最初に小さいテーブルにアクセスする必要性を解決できず、外部結合のために大きいテーブルに最初にアクセスする必要性を解決できなかったため、大きいテーブルから小さいテーブルへの外部結合はパフォーマンスの面で問題がありました。したがって、この状況ではハッシュ結合は使用できませんでした。
ハッシュ結合のコストは、結合キーで両方のテーブルを分割することで削減できます。これにより、オプティマイザーは、一方のテーブルのパーティションの行がもう一方のテーブルの特定のパーティションでのみ一致するものを検出し、n個のパーティションを持つテーブルの場合、ハッシュ結合はn個の独立したハッシュ結合として実行されると推測できます。これには次の効果があります:
- 各ハッシュテーブルのサイズが縮小されるため、必要なメモリの最大量が削減され、一時的なディスクスペースを必要とする操作が不要になる可能性があります。
- 並列クエリ操作の場合、各ハッシュ結合を1組のPQプロセスで実行できるため、プロセス間メッセージングの量が大幅に削減され、CPU使用率が低下し、パフォーマンスが向上します。
- 非並列クエリ操作の場合、メモリ要件は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