0

私はストアド プロシージャを作成しており、その機能は多数のパラメータ (エンド ユーザーによって設定されたもの) を取得して検索を実行することです。ただし、パラメーターに値がない場合は、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 番目のクエリ (結合されたテーブル) は不釣り合いに時間がかかる理由を誰か説明してもらえますか?

よろしくお願いします。

4

3 に答える 3

0

table2 の を削除し、以下のようLEFT JOINに単純なものに置き換えることで、この問題を最終的に解決しました。JOIN

SELECT *
FROM table1 t1

JOIN table2 t2
ON t1.table2Id = t2.id

WHERE (param1 = '' OR t2.field1 = param1)

正直なところ、これを LEFT JOIN にする理由はまったくありませんでした。考えてなかっただけ!とにかく、Evan と Michael の助けとアドバイス (そして彼らの非常に迅速な対応) に感謝します。

于 2013-04-05T14:40:16.370 に答える
0

の一部として最初の条件を追加してみて、JOINそれが役立つかどうかを確認してください。

SELECT *
FROM table1 t1

LEFT JOIN table2 t2
ON t1.table2Id = t2.id AND
t2.field1 = param1
于 2013-04-05T11:50:42.667 に答える
0

ビューを作成してみて、そのビューの結果を結合ステートメントで使用できます。

CREATE VIEW `VW_my_simple_table_view_name` AS SELECT *
FROM table1 t1
WHERE (param1 = '' OR t1.field1 = param1)

そして、クエリは次のようになります(調整が必要な場合があります)

SELECT *
FROM VW_my_simple_table_view_name t1

LEFT JOIN table2 t2
ON t1.table2Id = t2.id

WHERE (t2.field1 = param1)
于 2013-04-05T11:54:08.567 に答える