Apenas um palpite:
Quando você executa a consulta manualmente, a expressão
WHERE ('test' IS NULL or COL1 = 'test')
pode ser otimizado quando a consulta está sendo analisada. O analisador pode ver que a string 'test'
não é nulo, então converte o teste para WHERE COL1 = 'test'
. E se houver um índice em COL1
isso será usado. No entanto, quando você cria um procedimento armazenado, a análise ocorre quando o procedimento é criado. Nesse momento, ele não sabe o que
@param
será, e tem que implementar a consulta como uma varredura sequencial da tabela. Tente alterar seu procedimento para:
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;
Eu não tenho muita experiência com procedimentos armazenados do MySQL, então não tenho certeza se essa é a sintaxe correta.