検索機能用のかなり大きなクエリに取り組んでいます。多数の異なる入力があり、その結果、クエリはかなり大きくなります。2 層の深さのネストされたサブクエリがある場所まで成長します。大規模なデータセットを返すものでは、パフォーマンスが問題になり、そうするために大量のレコードをふるいにかける必要がある可能性があります。比較が少ないものはうまく機能しますが、これらのいくつかはかなり悪くなっています. データベースは DB2 であり、必要なすべてのインデックスを備えているため、問題になることはありません。オプティマイザーがそれをどのように処理するのかよくわからないので、これらのクエリを実行するためにどのように書く/書き直すのが最善なのか疑問に思っています。すべてをここに書き出すことはできませんが、例を次に示します。
Select A, B
from TableA
--A series of joins--
WHERE TableA.A IN (
Select C
from TableB
--A few joins--
WHERE TableB.C IN (
Select D from TableC
--More joins and conditionals--
)
)
全体に散りばめられた多くの条件もあり、その大部分は単純な等式です。あなたはアイデアを得る。サブクエリは、最初のクエリにデータを提供しません。結果をフィルタリングするためだけに存在します。私が早い段階で遭遇した問題は、最終的なクエリに組み立てられる多数の部分的なクエリ文字列を含むようにバックエンドが作成されていることです (検索オプションのために 100 以上の可能な組み合わせがあるため、クエリを作成することは単に実行不可能です)。これにより、全体的な方法が少し複雑になりました。IN の代わりに EXISTS が 1 つまたは両方のレベルで役立つかどうか、またはサブクエリの代わりに別の一連の結合が役立つかどうか、またはおそらく TableC の最初のクエリの上で WITH を使用するかどうかなどを考えています。私は間違いなくボトルネックを取り除きたいと思っています。これを処理する方法について人々が持つかもしれないフィードバック。
おそらく、両方のサブクエリ内に潜在的な結合があることも付け加えておく必要があります。