Gewoon een gok:
Wanneer u de query handmatig uitvoert, wordt de uitdrukking WHERE ('test' IS NULL or COL1 = 'test')
kan worden geoptimaliseerd wanneer de query wordt geparseerd. De parser kan zien dat de string 'test'
is niet null, dus het converteert de test naar WHERE COL1 = 'test'
. En als er een index is op COL1
dit wordt gebruikt.
Wanneer u echter een opgeslagen procedure maakt, vindt parsering plaats wanneer de procedure wordt gemaakt. Op dat moment weet het niet wat @param
zal zijn, en moet de query implementeren als een sequentiële scan van de tabel.
Probeer uw procedure te wijzigen in:
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;
Ik heb niet veel ervaring met opgeslagen MySQL-procedures, dus ik weet niet zeker of dat de juiste syntaxis is.