推測:
クエリを手動で実行する場合、式WHERE ('test' IS NULL or COL1 = 'test')
クエリの解析時に最適化できます。パーサーは、文字列'test'
を確認できます。 nullではないため、テストをWHERE COL1 = 'test'
に変換します。 。また、COL1
にインデックスがある場合 これが使用されます。
ただし、ストアドプロシージャを作成する場合、プロシージャの作成時に解析が行われます。その時、それは何の@param
を知りません テーブルの順次スキャンとしてクエリを実装する必要があります。
手順を次のように変更してみてください:
IF @param IS NULL
THEN BEGIN
SELECT * FROM table1
UNION ALL
SELECT * FROM table2
...
END;
ELSE BEGIN
SELECT * FROM table1 WHERE col1 = @param
UNION ALL
SELECT * FROM table2 WHERE col1 = @param
...
END;
END IF;
MySQLのストアドプロシージャの経験があまりないので、それが正しい構文かどうかはわかりません。