これはよくある質問であることは知っていますが、他のいくつかの投稿や論文を読みましたが、インデックス付きフィールドと両方のクエリが返す可能性のあるレコードの量を考慮したものを見つけることができませんでした.
私の質問は本当に簡単です。ここでは、SQL に似た構文で (パフォーマンスの観点から) 記述された 2 つのどちらが推奨されますか。
最初のクエリ:
Select *
from someTable s
where s.someTable_id in
(Select someTable_id
from otherTable o
where o.indexedField = 123)
2 番目のクエリ:
Select *
from someTable
where someTable_id in
(Select someTable_id
from otherTable o
where o.someIndexedField = s.someIndexedField
and o.anotherIndexedField = 123)
私の理解では、2番目のクエリは、外側のクエリが返すすべてのタプルについてデータベースにクエリを実行し、最初のクエリは最初に内側の選択を評価し、次にフィルターを外側のクエリに適用します。
someIndexedField フィールドがインデックス化されていることを考えると、2 番目のクエリはデータベースを超高速でクエリできますが、数千または数百万のレコードがあると言うと、最初のクエリを使用する方が高速ではないでしょうか?
注: Oracle データベース内。