首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql函数调用

问Mysql函数调用
EN

Stack Overflow用户
提问于 2013-01-16 18:53:54
回答 4查看 88.2K关注 0票数 5

如果我多次调用一个函数,那么它是每次都执行,还是只执行一次,然后在几次之后使用该值?示例:

代码语言:javascript
复制
 select my_function('filed'),my_function('filed')/field2, 
        (my_function('filed')*field1)/field3,
...... from my_table    where group by filed1;

我的问题是,my_function('filed')将执行一次,然后结果将在my_function('filed')/field2和(my_function('filed')*field1)/field3中使用,还是每次在系统级调用和执行my_function('filed')时都会使用?

EN

回答 4

Stack Overflow用户

发布于 2014-03-13 10:16:48

为什么不使用一个能捕捉函数值的变量呢?例如:

代码语言:javascript
复制
declare var_function (datatype(size)); // just to declare proper data type for your function

set var_function = my_function('filed');

select var_function, var_function/field2, 
        (var_function*field1)/field3,

....from my_table    where group by filed1;

在这种情况下,您将重用函数结果,而不需要重复函数的过程。

票数 7
EN

Stack Overflow用户

发布于 2013-01-16 19:02:34

如果您将函数声明为DETERMINISTIC,则可以进行一些优化。但它确实应该是确定性的:

如果一个例程总是对相同的输入参数产生相同的结果,那么它被认为是“确定性的”,否则就被认为是“非确定性的”。如果例程定义中既没有给定确定性,也没有给出非确定性,则缺省值不是确定性的。若要声明函数是确定性的,必须显式指定确定性。

对例程性质的评估基于创建者的“诚实”:MySQL不检查声明为确定性的例程是否没有产生不确定性结果的语句。但是,错误声明例程可能会影响结果或影响性能。将非确定性例程声明为确定性例程可能会导致优化器做出不正确的执行计划选择,从而导致意外结果。将确定性例程声明为非确定性可能会导致不使用可用的优化,从而降低性能。在MySQL 5.0.44之前,确定性特征被接受,但不被优化器使用。

票数 3
EN

Stack Overflow用户

发布于 2013-01-16 18:58:10

据我所知(不是mysql专家)它每次都会调用这个函数。你的解释计划应该显示出这个问题。

如果您总是使用相同的参数调用函数,则应该通过子查询每行查询一次。

代码语言:javascript
复制
select funcvalue, funcvalue/field2, (funcvalue*field1)/field3,...... 
from SELECT( my_function('filed') funcvalue, ... your other columns... 
FROM TABLE )
where group by filed1;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14356694

复制
相关文章

相似问题

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