2009-07-10 11 views

答えて

60

「ソート・マージ」結合は、結合する2つのデータ・セットを結合キーに従ってソートし、それらを一緒にマージすることによって実行されます。マージは非常に安いですが、特にソートがディスクにこぼれた場合、ソートは非常に高価になる可能性があります。索引走査を介して表のブロックの割合を高くすることは、全表走査と比較して非常に高価になる可能性があるが、索引を介してデータセットのうちの1つをソート順でアクセスすることができるならば、ソートのコストを下げることができる。

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

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

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

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

一般に、等価結合で大量のデータを結合する場合、ハッシュ結合がより良い方法になります。

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

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

6

私は、この質問に回答したときにoracleのタグが追加されていないことを後のために編集したいだけです。私の応答はMS SQLにもっと適用されました。

マージ・ジョインは、順序付けを利用するので可能です。その結果、ジョインを行うためにテーブルを1回パスする必要があります。主キーやそのキーのテーブルのインデックスなどの順序が同じ2つのテーブル(またはカバリングインデックス)がある場合、そのアクションを実行するとマージ結合が行われます。

ハッシュ結合は、一方の表が比較的少数の項目を持つときに通常行われるように、通常は行ごとにハッシュ付きの一時表を作成し、次に連続して検索して結合を作成するときに行われるため、

最悪のケースは順序(n * m)であり、利用する順序やサイズがないことを意味し、結合は単純に、テーブルxの各行について、結合のためのテーブルyを検索することです。

+8

いつも他のものより優れていれば、もう一方は決して使用されないだろうと思いませんか?私は違いがこれより複雑だと思う。 –

+1

あなたが私を誤解した場合は、すみません。私は、ジョインのタイプとマージ・ジョインが最も良い理由を説明しようとしていました。問題は、マージ・ジョインは、ソート順が悪用されていて、結合された表の行数が比較的少ない場合にのみハッシュ結合が効率的である場合にのみ機能することです。それが答えではっきりしていない場合にはお詫び申し上げます。 – Spence

+0

ネストされたループは、もちろん最悪です。 – Spence

関連する問題