1

9iで次のクエリがあるとします。

SELECT /*+ USE_HASH(t2 t3) */
* FROM
table1 t1    -- this has lots of rows
LEFT JOIN table2 t2 ON t1.col1 = t2.col1
    AND t1.col2 = t2.col2
LEFT JOIN table3 t3 ON t1.col1 = t3.col1
    AND t1.col2 = t3.col2

9iにはRIGHTOUTERHASH JOINがないため、両方の結合に対してtable1をハッシュする必要があります。結合と(同じ結合列を使用している場合でも)のtable1間で再ハッシュしますか、それとも両方の結合に対して同じハッシュ情報を保持しますか?t2t3

4

2 に答える 2

2

2番目のハッシュはtable1ではなくtable1/table2の結合に対してtable3になるため、再ハッシュする必要があります。またはその逆。

たとえば、TABLE1に100行、table2に50行、table3に10行があるとします。table1をtable2に結合すると、500行になる場合があります。次に、その結​​果セットをtable3に結合して、(おそらく)700行を生成します。

table1からtable2への結合、次にtable1からtable3への結合、そしてこれら2つの中間結果の結合は実行されません。

于 2010-06-02T23:56:27.940 に答える
1

計画を見てください、それはあなたに答えを教えてくれます。

例は次のようになります(私はこれを作成しました):

SELECT
  HASH JOIN
    HASH JOIN
      TABLE FULL SCAN table1
      TABLE FULL SCAN table2
  TABLE FULL SCAN table3

このサンプルプランには、table1をスキャンし、その内容をハッシュ化することが含まれます。table2をスキャンし、結合の結果を2番目のハッシュにハッシュしてから、最後にtable3をスキャンします。

それが選ぶことができる他の計画があります。

table1が最大のテーブルであり、オプティマイザーがこれを知っている場合(統計のため)、おそらくそれからドライブすることはありません。

于 2010-06-02T12:04:27.497 に答える