5

関数を数回呼び出すと、毎回実行されますか、それとも 1 回だけ実行され、値は数回後に使用されますか? 例:

 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)/field3my_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プロではありません)、毎回この関数を呼び出しています。あなたのexpalin計画はその問題を示すべきです。

常に同じ引数を使用して関数を呼び出す場合は、サブクエリを介して行ごとに1回クエリを実行します。

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 に答える