UNION
(またはUNION ALL
重複を排除したくない場合)を使用できます。
select ... from myTable where A = <something>
UNION [ALL]
select ... from myTable where B = <something>
または、説明したように、それを1つのクエリでORと組み合わせて、クエリプランを調べて、インデックスが実際に除外されているかどうかを確認することもできます。
Oracleには非常にスマートなオプティマイザがあり、SQLを宣言型にすることの全体的なポイントは、データベースに必要なものを伝えることに時間を費やし、データベースを離れてそれを取得するための最善の方法を決定することです(かなり大きな注意が必要ですが、言わなければなりません) 、オプティマイザに悪い選択を強いることができる多くの状況がありますが、私の経験では、他のデータベースよりもやや遅れてそのハードルに到達する傾向があります)。
あなたの場合、Oracleがおそらく行うことは、次のことを調べることです。
- どのインデックスが存在するか
- カーディナリティ、つまり特定のインデックスのさまざまな値の「広がり」
- 統計、データ量など。
その後、情報に基づいた決定を下します。そして、その決定は、クエリが実行された時点(または少なくとも統計が最後に更新された時点)の現在のデータに基づいて行われます。したがって、ヒントを使用してインデックスの使用を強制することは可能かもしれませんが、そうすることで、データが大きく異なるように見えるときに、 Oracleが後日データを介して最も効率的なパスを見つけられなくなる可能性があります。