首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从SELECT语句中调用MySQL函数比单独从命令提示符调用该函数花费更多的时间。

从SELECT语句中调用MySQL函数比单独从命令提示符调用该函数花费更多的时间。
EN

Stack Overflow用户
提问于 2016-10-03 16:04:06
回答 1查看 61关注 0票数 2

我在mysql中有以下功能

代码语言:javascript
复制
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分钟。

代码语言:javascript
复制
select * from issues where project_uuid = get_project_uuid('Project1')

但是,当我从函数中获取select语句并直接在宿主select语句中使用它而不是函数调用时,它在几毫秒内工作。

代码语言:javascript
复制
select * from issues where project_uuid = (
    select project_uuid from projects
    where scope='PRJ' and kee='Project1'
)

使用这个函数所花费的时间似乎是非常不寻常的。现在,由于时间较长,我不得不不使用该功能。我错过什么了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-03 20:54:36

当您从命令行调用get_project_uuid()函数时,它只调用一次,因此它运行得更快。

当您在select语句中使用此函数时(即问题中的第二个代码部分),根据语句的不同,可能会对外部select语句中使用的 section 表的每一行调用此函数。现在,如果问题表有很多行,那么执行可能需要更长的时间。

最后,对于第三个代码块,它可能会更快一些,因为mysql不会为问题表的每一行运行内部select语句。这是通过使用来自内部select语句的相同值来进行优化的一部分。

如果您希望更快地使用该函数,则可以将该函数声明为deterministic.。给定相同输入总是生成相同输出的函数可以声明为确定性。现在你必须决定这是否适用于你的案件。如果错误地将非确定性函数声明为确定性函数,Mysql不会抱怨。但是你这样做会得到错误的结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39835819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档