私はストアド プロシージャを作成しており、その機能は多数のパラメータ (エンド ユーザーによって設定されたもの) を取得して検索を実行することです。ただし、パラメーターに値がない場合は、WHERE 句に含めないでください。このために、次のように、OR 句の最初の部分としてパラメーターのチェックを実行しています。
... WHERE (param1 = '' OR field1 = param1) AND (param2 = '' OR field2 = param2) ...
次に、これを次のような一般的な選択ステートメントに組み込みました。
SELECT *
FROM table1 t1
WHERE (param1 = '' OR t1.field1 = param1)
わかりやすくするために、この例では 1 つのパラメーターのみを含めていることに注意してください。実際のクエリには、複数のパラメーターとフィールド比較が含まれています。
これは問題なく動作し、すばやく実行されます (たとえば、「実際の」クエリは約 0.5 秒で結果を返します)。
ここまでは順調ですね。ただし、結合されたテーブルを導入すると、問題が発生し始めます。たとえば、以下のクエリを実行すると、はるかに時間がかかります (実際のクエリでは 3 ~ 4 秒)。
SELECT *
FROM table1 t1
LEFT JOIN table2 t2
ON t1.table2Id = t2.id
WHERE (param1 = '' OR t2.field1 = param1)
パラメータが結合されたテーブル (table2) のフィールドと比較されていることに注意してください。
これらの両方の例で、クエリを実行するときに、param1 に値が入力されていることを確認しました。
ここで、上記の WHERE 句のセクションを削除するparam1 = '' OR
と、以前の結合されていないクエリと同じくらい速く実行されます。
テーブルで使用されているフィールドは現在インデックス化されていませんが、これを試してみましたが、問題に違いはありませんでした。
では、最初のクエリ (単一のテーブル) はすばやく動作するのに、2 番目のクエリ (結合されたテーブル) は不釣り合いに時間がかかる理由を誰か説明してもらえますか?
よろしくお願いします。