Juste une supposition :
Lorsque vous exécutez la requête manuellement, l'expression WHERE ('test' IS NULL or COL1 = 'test')
peut être optimisé lors de l'analyse de la requête. L'analyseur peut voir que la chaîne 'test'
n'est pas nul, il convertit donc le test en WHERE COL1 = 'test'
. Et s'il y a un index sur COL1
cela sera utilisé.
Toutefois, lorsque vous créez une procédure stockée, l'analyse se produit lors de la création de la procédure. A ce moment, il ne sait pas ce que @param
sera, et doit implémenter la requête comme une analyse séquentielle de la table.
Essayez de modifier votre procédure en :
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;
Je n'ai pas beaucoup d'expérience avec les procédures stockées MySQL, donc je ne suis pas sûr que ce soit la bonne syntaxe.