web-dev-qa-db-ja.com

Mysql関数呼び出し

関数を数回呼び出すと、毎回実行されますか、それとも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)/field3_で使用されるか、my_function('filed')が呼び出されて実行されるたびに使用されることです。システムレベルで?

5
Samiul

関数の値をキャッチする変数を使用してみませんか。例えば:

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
wedev27

関数を DETERMINISTIC として宣言すると、最適化を行うことができます。しかし、それは本当に決定論的でなければなりません:

ルーチンは、同じ入力パラメーターに対して常に同じ結果を生成する場合は「決定論的」と見なされ、それ以外の場合は「決定論的ではない」と見なされます。ルーチン定義でDETERMINISTICもNOTDETERMINISTICも指定されていない場合、デフォルトはNOTDETERMINISTICです。関数が決定論的であることを宣言するには、DETERMINISTICを明示的に指定する必要があります。

ルーチンの性質の評価は、作成者の「誠実さ」に基づいています。MySQLは、DETERMINISTICと宣言されたルーチンに非決定論的な結果を生成するステートメントがないことをチェックしません。ただし、ルーチンを誤って宣言すると、結果に影響したり、パフォーマンスに影響したりする可能性があります。非決定論的ルーチンをDETERMINISTICとして宣言すると、オプティマイザーが誤った実行プランを選択するため、予期しない結果が生じる可能性があります。決定論的ルーチンをNONDETERMINISTICとして宣言すると、使用可能な最適化が使用されなくなるため、パフォーマンスが低下する可能性があります。 MySQL 5.0.44より前では、DETERMINISTIC特性は受け入れられますが、オプティマイザでは使用されません。

3
triclosan

私の知る限り(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;
2
Najzero

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)

手順の代わりに、上記の例で任意の複数行関数を追加できます。

1
Sumit Munot