5

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

 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')将在系统级别调用和执行?

4

4 回答 4

7

为什么不使用捕获函数值的变量。例如:

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;

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

于 2014-03-13T02:16:47.880 回答
3

如果您将函数声明为DETERMINISTIC. 但它确实应该是确定性的:

如果一个例程对于相同的输入参数总是产生相同的结果,则该例程被认为是“确定性的”,否则被认为是“非确定性的”。如果例程定义中既没有给出 DETERMINISTIC 也没有给出 NOT DETERMINISTIC,则默认为 NOT DETERMINISTIC。要声明函数是确定性的,您必须明确指定 DETERMINISTIC。

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

于 2013-01-16T11:02:34.413 回答
2

据我所知(不是 mysql pro)它每次都调用这个函数。你的解释计划应该表明这个问题。

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

select funcvalue, funcvalue/field2, (funcvalue*field1)/field3,...... 
from SELECT( my_function('filed') funcvalue, ... your other columns... 
FROM TABLE )
where group by filed1;
于 2013-01-16T10:58:10.047 回答
1

运行 MySQL 函数非常简单。

使用命令登录到 MySQL 命令提示符:

$> mysql -u root -p

然后使用数据库:

mysql> use database_name

然后使用以下命令运行 MySQL 函数:

mysql> delimiter //

mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
    -> BEGIN
    ->   SELECT COUNT(*) INTO param1 FROM t;
    -> END//
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

mysql> CALL simpleproc(@a);
Query OK, 0 rows affected (0.00 sec)

我们可以在上面的示例中添加任何多行函数,而不是过程。

于 2015-05-16T01:14:19.560 回答