web-dev-qa-db-ja.com

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

特にOracle RDBMSでのハッシュ結合とマージ結合の間のパフォーマンスの向上/損失は何ですか?

57
Andrew Martinez

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

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

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

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

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

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

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

このトピックについては、ドキュメントで詳しく説明しています。

http://download.Oracle.com/docs/cd/B28359_01/server.111/b28274/optimops.htm#i5152

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

73
David Aldridge

この質問に答えたときにOracleのタグが追加されなかったという後世のためにこれを編集したいだけです。私の回答はMS SQLにより適していました。

マージ結合は順序付けを活用するため、可能な限り最適です。結果として、結合を実行するためにテーブルを1回パスダウンします。主キーとそのキーのテーブルのインデックスなどの順序が同じ2つのテーブル(またはカバーインデックス)がある場合、そのアクションを実行するとマージ結合が発生します。

ハッシュ結合は次のベストです。通常、1つのテーブルに少数の(比較的)アイテムがある場合に実行されます。各行のハッシュを含む一時テーブルを効果的に作成し、継続的に検索して結合を作成します。

最悪の場合は、順序(n * m)であるネストされたループです。つまり、利用する順序やサイズはなく、結合は、テーブルxの各行に対して、結合するテーブルyを検索するだけです。

7
Spence