関数を数回呼び出すと、毎回実行されますか、それとも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')
が呼び出されて実行されるたびに使用されることです。システムレベルで?
関数の値をキャッチする変数を使用してみませんか。例えば:
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;
その場合、関数の結果を再利用することになり、関数のプロセスを繰り返す必要はありません。
関数を DETERMINISTIC
として宣言すると、最適化を行うことができます。しかし、それは本当に決定論的でなければなりません:
ルーチンは、同じ入力パラメーターに対して常に同じ結果を生成する場合は「決定論的」と見なされ、それ以外の場合は「決定論的ではない」と見なされます。ルーチン定義でDETERMINISTICもNOTDETERMINISTICも指定されていない場合、デフォルトはNOTDETERMINISTICです。関数が決定論的であることを宣言するには、DETERMINISTICを明示的に指定する必要があります。
ルーチンの性質の評価は、作成者の「誠実さ」に基づいています。MySQLは、DETERMINISTICと宣言されたルーチンに非決定論的な結果を生成するステートメントがないことをチェックしません。ただし、ルーチンを誤って宣言すると、結果に影響したり、パフォーマンスに影響したりする可能性があります。非決定論的ルーチンをDETERMINISTICとして宣言すると、オプティマイザーが誤った実行プランを選択するため、予期しない結果が生じる可能性があります。決定論的ルーチンをNONDETERMINISTICとして宣言すると、使用可能な最適化が使用されなくなるため、パフォーマンスが低下する可能性があります。 MySQL 5.0.44より前では、DETERMINISTIC特性は受け入れられますが、オプティマイザでは使用されません。
私の知る限り(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;
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)
手順の代わりに、上記の例で任意の複数行関数を追加できます。