我在mysql中有以下功能
CREATE FUNCTION `get_project_uuid`(project_kee varchar(400)) RETURNS varchar(50) CHARSET utf8
BEGIN
declare v_project_uuid varchar(50);
select project_uuid into v_project_uuid from projects where scope='PRJ' and kee=project_kee;
RETURN v_project_uuid;
END当我直接从mysql命令提示符运行这个函数时,它会在几毫秒内运行,但是当我在另一个select语句中使用这个函数时,执行那个hosing语句大约需要2-3分钟。
select * from issues where project_uuid = get_project_uuid('Project1')但是,当我从函数中获取select语句并直接在宿主select语句中使用它而不是函数调用时,它在几毫秒内工作。
select * from issues where project_uuid = (
select project_uuid from projects
where scope='PRJ' and kee='Project1'
)使用这个函数所花费的时间似乎是非常不寻常的。现在,由于时间较长,我不得不不使用该功能。我错过什么了吗?
发布于 2016-10-03 20:54:36
当您从命令行调用get_project_uuid()函数时,它只调用一次,因此它运行得更快。
当您在select语句中使用此函数时(即问题中的第二个代码部分),根据语句的不同,可能会对外部select语句中使用的 section 表的每一行调用此函数。现在,如果问题表有很多行,那么执行可能需要更长的时间。
最后,对于第三个代码块,它可能会更快一些,因为mysql不会为问题表的每一行运行内部select语句。这是通过使用来自内部select语句的相同值来进行优化的一部分。
如果您希望更快地使用该函数,则可以将该函数声明为deterministic.。给定相同输入总是生成相同输出的函数可以声明为确定性。现在你必须决定这是否适用于你的案件。如果错误地将非确定性函数声明为确定性函数,Mysql不会抱怨。但是你这样做会得到错误的结果。
https://stackoverflow.com/questions/39835819
复制相似问题