MySQL - 查询速度快但存储过程速度慢
MySQL - Fast query but slow Stored Procedures
我知道这个问题已经被讨论了很多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
性能:
Query
如果我只是 运行 查询 - 300 毫秒
Stored Procedure
CALL MyReport('0000_abcd_fake_000')
这个程序不停地运行ning。
我的问题是,如何禁用 parameter sniffling
并使用局部变量而不是 find_in_set
来匹配查询性能。
我需要将任意事物列表传递给存储过程的次数,我是这样做的:
CREATE
(或已经有)一个 TABLE
用于传递信息。调用者和过程都知道过程的名称。 (或者也可以传进来,但是会增加一些杂乱"prepare-executes"。)
- 对 table 做大量
INSERT
。 (INSERT INTO tbl (a,b) VALUES (...), (..), ...;
)
- 执行
JOINs
或任何有效使用 table 的操作。
就我而言,额外的努力是值得的。
我知道这个问题已经被讨论了很多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
性能:
Query
如果我只是 运行 查询 - 300 毫秒
Stored Procedure
CALL MyReport('0000_abcd_fake_000')
这个程序不停地运行ning。
我的问题是,如何禁用 parameter sniffling
并使用局部变量而不是 find_in_set
来匹配查询性能。
我需要将任意事物列表传递给存储过程的次数,我是这样做的:
CREATE
(或已经有)一个TABLE
用于传递信息。调用者和过程都知道过程的名称。 (或者也可以传进来,但是会增加一些杂乱"prepare-executes"。)- 对 table 做大量
INSERT
。 (INSERT INTO tbl (a,b) VALUES (...), (..), ...;
) - 执行
JOINs
或任何有效使用 table 的操作。
就我而言,额外的努力是值得的。