Jen odhad:
Když spustíte dotaz ručně, výraz WHERE ('test' IS NULL or COL1 = 'test')
lze optimalizovat při analýze dotazu. Analyzátor vidí, že řetězec 'test'
není null, takže převede test na WHERE COL1 = 'test'
. A pokud je na COL1
index toto bude použito.
Když však vytvoříte uloženou proceduru, k analýze dojde při vytvoření procedury. V té době neví co @param
bude a musí implementovat dotaz jako sekvenční skenování tabulky.
Zkuste změnit svůj postup na:
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;
Nemám mnoho zkušeností s uloženými procedurami MySQL, takže si nejsem jistý, zda je to správná syntaxe.