1

Oracle DBにテーブルがあり、1つはテーブルフィールドA用、もう1つはテーブルフィールドB用です。次に、フィールドAに特定の値またはフィールドBに別の特定の値を持つすべてのレコードを選択する必要があります。

もちろん、インデックスを使用するために、フィールドAで1つのSELECTを作成し、次にフィールドBで別のSELECTを作成することができます。したがって、両方のインデックスが使用されていることを確認できます。

ただし、ORに接続されたWHERE句の1つのSELECTと両方のフィールドを使用してこれを実行したいと思います。このような場合と上記の私の設定では、Oracleが私の2つのインデックスを利用するのに十分賢いのか、それとも2つのSELECTを使い続けることができないのかを知っていますか?

ありがとう!

4

2 に答える 2

2

UNION(またはUNION ALL重複を排除したくない場合)を使用できます。

select ... from myTable where A = <something>
UNION [ALL]
select ... from myTable where B = <something>

または、説明したように、それを1つのクエリでORと組み合わせて、クエリプランを調べて、インデックスが実際に除外されているかどうかを確認することもできます。

Oracleには非常にスマートなオプティマイザがあり、SQLを宣言型にすることの全体的なポイントは、データベースに必要なものを伝えることに時間を費やし、データベースを離れてそれを取得するための最善の方法を決定することです(かなり大きな注意が必要ですが、言わなければなりません) 、オプティマイザに悪い選択を強いることができる多くの状況がありますが、私の経験では、他のデータベースよりもやや遅れてそのハードルに到達する傾向があります)。

あなたの場合、Oracleがおそらく行うことは、次のことを調べることです。

  • どのインデックスが存在するか
  • カーディナリティ、つまり特定のインデックスのさまざまな値の「広がり」
  • 統計、データ量など。

その後、情報に基づいた決定を下します。そして、その決定は、クエリが実行された時点(または少なくとも統計が最後に更新された時点)の現在のデータに基づいて行われます。したがって、ヒントを使用してインデックスの使用を強制することは可能かもしれませんが、そうすることで、データが大きく異なるように見えるときに、 Oracleが後日データを介して最も効率的なパスを見つけられなくなる可能性があります。

于 2012-10-05T09:00:20.260 に答える
1

一般に、Oracleがオプティマイザで実際にインデックスをどのように使用するかを正確に知ることはできないため、Oracleにインデックスの使用を強制するような方法でselectステートメントを作成することはお勧めできません。

必要に応じて、Oracleに(ヒント付きの)インデックスを使用させることができますが、オプティマイザーは通常、より適切な仕事をします。

于 2012-10-05T09:01:05.983 に答える