我知道这个问题已经讨论了很多here。但是我有一个特殊的情况,当我需要传递参数列表(逗号分隔)时,这会使我无法声明局部变量并将其用作输入参数。
如以上讨论中所指出,建议声明一个局部变量并将参数分配给该变量。但是,如果我的参数类型为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
来匹配查询性能。
答案 0 :(得分:1)
我需要将任意的事物列表传递给存储过程的时间,我这样做是这样的:
CREATE
(或已经有一个)TABLE
用于传递信息。调用方和过程都知道过程的名称。 (或者可以传入,但是添加一些混乱的“准备执行”。)INSERT
。 (INSERT INTO tbl (a,b) VALUES (...), (..), ...;
)JOINs
或有效地使用表格的任何操作。就我而言,付出额外的努力是值得的。