【问题标题】:Mysql function callmysql函数调用
【发布时间】:2012-12-30 16:05:47
【问题描述】:

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

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

【问题讨论】:

  • 函数每次都会执行。返回的值是否被缓存取决于实现。

标签: mysql stored-functions


【解决方案1】:

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

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;

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

【讨论】:

    【解决方案2】:

    运行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)
    

    我们可以在上面的例子中添加任何多行函数来代替程序。

    【讨论】:

    • 这并不能真正回答问题。此外,CALL 仅适用于过程,不适用于函数
    • @Sebastianb,在“delimiter //”提示下,我们也可以调用函数。使用 CALL 只是程序参考的一个例子。
    【解决方案3】:

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

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

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

    【讨论】:

    • 非常感谢您提供的宝贵信息。我需要澄清上面示例中的一件事,您会看到我使用了 group by 子句,实际上我正在使用 12 个存储函数计算 84 个字段,该函数影响 511 行。在这种情况下,我应该明确声明为 DETERMINISTIC 吗?
    【解决方案4】:

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

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

    select funcvalue, funcvalue/field2, (funcvalue*field1)/field3,...... 
    from SELECT( my_function('filed') funcvalue, ... your other columns... 
    FROM TABLE )
    where group by filed1;
    

    【讨论】:

      猜你喜欢
      • 2015-02-25
      • 1970-01-01
      • 2019-07-09
      • 2011-02-13
      • 1970-01-01
      • 2015-12-14
      • 2012-12-21
      • 2014-05-23
      • 2021-10-08
      相关资源
      最近更新 更多