MySQL - быстрый запрос, но медленные хранимые процедуры - PullRequest
0 голосов
/ 28 июня 2019

Я знаю, что этот вопрос обсуждался довольно часто здесь .Но у меня есть особый случай, когда мне нужно передать список параметров (через запятую), который не позволяет мне объявить и использовать локальную переменную для входного параметра.

Как указано в приведенном выше обсуждении, онпредлагается объявить локальную переменную и назначить параметры этой переменной.Однако что мне делать, если мой параметр имеет тип Text и может быть разделен запятыми?

Например -

CREATE DEFINER=`Admin`@`%` PROCEDURE `MyReport`(
    p_myparameter_HK Text
)
BEGIN
SELECT
*
FROM MyTable
WHERE 
(find_in_set(MyTable.column_HK, p_myparameter_HK) <> 0 OR MyTable.column_HK IS NULL)
;

END

Производительность:

Запрос

Если я просто выполню запрос - 300 мс

Хранимая процедура

CALL MyReport('0000_abcd_fake_000')

Эта процедура продолжает работать бесконечно.

Мой вопрос: как я могу отключить parameter sniffling и использовать локальную переменную вместо find_in_set, чтобы соответствовать производительности запроса.

1 Ответ

1 голос
/ 29 июня 2019

Когда мне нужно было передать произвольный список вещей в хранимую процедуру, я сделал это следующим образом:

  • CREATE (или уже есть) TABLE для передачи информации. И вызывающая сторона, и Процедура знают имя процедуры. (Или это может быть передано, но добавляет некоторые грязные «подготовить-выполнить».)
  • Сделайте большую часть INSERT в этот стол. (INSERT INTO tbl (a,b) VALUES (...), (..), ...;)
  • Выполните JOINs или что-либо еще, чтобы эффективно использовать таблицу.

В моем случае, дополнительные усилия того стоили.

...