異なるが、クエリヒントに、単一のテーブルのために参加するためにはどのように異なるのヒントを選ぶことができますか?
-
22-09-2019 - |
質問
私は次のクエリを持っていると仮定
select * from A, B, C, D
where A.x = B.x
and B.y = C.y
and A.z = D.z
私はA.xとB.xとB.yとC.yとD.zにインデックスを持っている。
A.zにはインデックスがありません。
どのように私はA.xのINDEXヒントが、A.z上USE_HASHヒントを使用するには、このクエリにヒントを与えることができますか?これは、ヒントは、特定の参加、テーブル名を取るないように思えるので、複数持つ単一のテーブルを使用しているとき、私は唯一のそれらのすべてのための単一の戦略を指定することができます参加します。
オルタナティブは、私が上記のクエリにLEADINGまたはORDEREDヒントを使用していたとします。これらのヒントの両方がだけなのでどのように私はA.x = B.xが参加A.z = D.z 1の前に行われることを確保することができ、同様にテーブル名を取りますか?私はこのケースでは、私は最初のDを一覧表示するが、Dは、その後Eに合流し、D-Eの参加は、私はクエリ全体でほしい最後の一つであることを想像実現します。
第三の構成 - 私はA.xたいとクエリ全体の最初のように参加して、私はA.zは最後の一つであることが参加します。どのように私は参加して、A-Dが最後に参加?
B-Cに続いて、単一の場所を取るためにAから参加持っているヒントを使用することができます解決
まず第一に、最後の手段ではなく、クエリを記述する通常の方法でなければなりません。ほとんどの時間、あなただけではオプティマイザの統計が最新であることを確認し、自分自身のための最適な経路からCBOの仕事をさせてください! - その仕事です。
INDEXヒントは、あなたがこのように使用するインデックスの名前を指定することができます:
SELECT /*+ INDEX (A, A_X_IDX) */ *
...
(A.XにインデックスがA_X_IDX呼ばれると仮定して)。
あなたはA.Xのインデックスのオラクルの利用用途を言うことができないとのハッシュを使用しても意味がありません同じ文でテーブルAに参加します。しかし、あなたは(あなたがしなければならない場合)のように、各テーブルの何かのためにアクセス・パスを指定することができます:
SELECT /*+ INDEX (A, A_X_IDX) INDEX(B, B_Y_IDX) USE_HASH(C) */ *
しかし、繰り返しに、それがあるべきまれなの のニーズにこれを行うには。 Oracleはなぜそれを効果的にオフに、CBOの開発にドルや工数の何百万を投資している?
他のヒント
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に残っていますか?