静的クエリ アプローチの使用には問題があります。また、CURSOR_SHARING=FORCE オプションの使用にも十分注意してください。他のすべてのクエリが希望どおりに機能することを確認するカバレッジ テストを行っていない場合、システムが非常に混乱する可能性があります。
静的クエリの問題:
(x is null または x = col) 述語は、インデックスを使用する可能性をなくす傾向があります。クエリ プランはクエリが最初に解析されるときに計算されるため、使用するインデックスはクエリの最初の実行の値に基づきます。同じ列に制約されない可能性がある後の実行でも、同じインデックスが使用されます。
置換変数を含む静的ステートメントが 1 つあると、オプティマイザーがデータ分散に基づいて使用するインデックスを適切に選択できなくなります。動的クエリ (またはバインド変数を使用したクエリの最初の実行) では、Oracle は制約がどの程度選択的であるかを確認します。高度に選択的な制約は、索引の使用の最有力候補になります。たとえば、テーブルに米国内のすべての人の行がある場合、STATE='Alaska' は STATE='California' よりも STATE のインデックスを使用する可能性が高くなります。
もちろん、どちらの場合でも、WHERE 句の動的列にインデックスが付けられていなくても問題ありませんが、あなたが話しているサイズのデータベースでそうであった場合は驚くでしょう。
また、すべての難しい解析の実際のコストを考慮してください。はい、ハード解析はシステム リソースをシリアル化するため、コストが高くなりますが、大量のクエリのコンテキストでのみ使用できます。その性質上、アドホック クエリは頻繁には実行されません。1 日に発生するすべてのハード パースに対して支払うコストは、間違ったインデックスを使用する単一のクエリのコストよりも数百分の 1 になる可能性があります。
過去に、私はあなたがここで行ったのとほとんど同じようにこれらのシステムを実装しました - 基本クエリ部分、次に制約リストを反復処理し、WHERE 句の述語を追加しました。FROM 句に多くのサブクエリや余分なテーブルを追加する必要のない制約について話している場合は特に、誰かが維持または理解するのは難しいとは思いません。
考慮すべき 1 つの点: このシステムが主にオフラインのシステムである場合 (つまり、定期的に大量のデータが読み込まれるため、常に更新または挿入されているわけではない)、BITMAP インデックスの使用を検討することをお勧めします。ビットマップ インデックスは、1 つのテーブルで複数のインデックスを同時に使用できるという点で、通常の B ツリー インデックスとは異なります。これらは、設計時に定義できないさまざまな制約があるこのようなアプリケーションで非常にうまく機能します。ビットマップ インデックスは、個別の値が比較的少ない列 (たとえば、1 つの値がテーブルの 1/1000 以上を構成するなど) にのみ配置する必要があるため、一意の列にはビットマップを使用しないでください。
ただし、マイナス面は、ビットマップ インデックスが挿入と更新のパフォーマンスを著しく低下させることです。ビットマップのベスト プラクティスは、データ ウェアハウス アプリケーションでビットマップを使用することです。ビットマップは、ロード前に削除され、後で再作成されます。