1

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

select * from A, B, C, D
where A.x = B.x
and B.y = C.y
and A.z = D.z

Ax と Bx と By と Cy と Dz にインデックスがあります

Azにはインデックスがありません

このクエリにヒントを与えて、Ax では INDEX ヒントを使用し、Az では USE_HASH ヒントを使用するにはどうすればよいですか? ヒントは特定の結合ではなくテーブル名のみを取るように思われるため、複数の結合を持つ単一のテーブルを使用する場合、それらすべてに対して単一の戦略しか指定できません。

別の方法として、上記のクエリで LEADING または ORDERED ヒントを使用しているとします。これらのヒントはどちらもテーブル名のみを使用するため、Ax = Bx 結合が Az = Dz 結合の前に確実に行われるようにするにはどうすればよいでしょうか? この場合、D を最初にリストすることができますが、D がその後 E に結合し、DE 結合がクエリ全体で必要な最後の結合であると想像してください。

3 番目の構成 -- Ax 結合をクエリ全体の最初にし、Az 結合を最後にしたいとします。ヒントを使用して、A からの単一の結合を実行し、その後に BC 結合を実行し、最後に AD 結合を実行するにはどうすればよいですか?

4

2 に答える 2

3

まず第一に、このようなヒントを使用するのは最後の手段であり、クエリを記述する通常の方法ではありません。ほとんどの場合、オプティマイザーの統計情報が最新であることを確認し、CBO が最適なパスを見つけられるようにする必要があります。それが CBO の仕事です。

INDEX ヒントは、次のように使用するインデックスの名前を指定できます。

SELECT /*+ INDEX (A, A_X_IDX) */ *
...

(AX のインデックスが A_X_IDX と呼ばれると仮定します)。

Oracle が AXインデックスを使用し、同じステートメントでテーブル A へのハッシュ結合を使用することを伝えることはできません。これは意味がありません。ただし、必要に応じて、次のように各テーブルのアクセス パスを指定できます。

SELECT /*+ INDEX (A, A_X_IDX) INDEX(B, B_Y_IDX) USE_HASH(C) */ *

ただし、繰り返しますが、これを行う必要があることはめったにありません。オラクルは数百万ドルと工数を CBO の開発に投資してきました。

于 2010-03-26T16:17:03.027 に答える
0

SQL Server では、次のようなハッシュ ジョイント ヒントを実行します。

SELECT * FROM table1 t1
INNER hash join table2 t2 ON  t1.id = t2.id

また、インデックスのヒントを提供することもできます

select * from table1 t1
inner  join table2 t2 with (index( bla))  on  t1.id = t2.id

Oracle で構文がどのように見えるかわかりません。ところで、なぜ古いスタイルの結合を使用しているのですか? まだ8iですか?

于 2010-03-26T15:50:47.270 に答える