Bara en gissning:
När du kör frågan för hand, uttrycket WHERE ('test' IS NULL or COL1 = 'test')
kan optimeras när frågan tolkas. Parsern kan se att strängen 'test'
är inte null, så det konverterar testet till WHERE COL1 = 'test'
. Och om det finns ett index på COL1
detta kommer att användas.
Men när du skapar en lagrad procedur, sker analys när proceduren skapas. Vid den tiden vet den inte vad @param
kommer att vara och måste implementera frågan som en sekventiell genomsökning av tabellen.
Försök att ändra din procedur till:
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;
Jag har inte mycket erfarenhet av MySQL-lagrade procedurer, så jag är inte säker på att det är rätt syntax.