Tylko zgadnij:
Po ręcznym uruchomieniu zapytania wyrażenie WHERE ('test' IS NULL or COL1 = 'test')
można zoptymalizować podczas analizowania zapytania. Parser widzi, że ciąg 'test'
nie jest null, więc konwertuje test na WHERE COL1 = 'test'
. A jeśli istnieje indeks na COL1
to zostanie użyte.
Jednak podczas tworzenia procedury składowanej analizowanie odbywa się podczas tworzenia procedury. W tym czasie nie wie, co @param
będzie i musi zaimplementować zapytanie jako sekwencyjne skanowanie tabeli.
Spróbuj zmienić procedurę 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;
Nie mam dużego doświadczenia z procedurami składowanymi MySQL, więc nie jestem pewien, czy jest to właściwa składnia.