2

MySQL では、次のクエリが与えられます。

select column1
, column2
, my_function1(column3) as f1
, my_function2(column4) as f2
, my_function3 (my_function1(column3), my_function2(column4)) as f3
where some condition on column 1 
having f1 > some value

my_function1(column3) は 3 回呼び出されますか? または、計算された値を再利用する最適化/キャッシュがありますか?

ありがとうございました

4

3 に答える 3

0

この関数は、計算ごとに個別に呼び出されます。1 つのクエリ内で何度でも再利用できます。

于 2013-04-22T17:18:58.980 に答える
0

決定論的として宣言されていない限り、関数は 3 回呼び出されますが、これは MySQL のバージョンに依存し、関数が 1 回呼び出されるかどうかはわかりません。詳細については、http://dev.mysql を参照してください。 com/doc/refman/5.6/en/create-procedure.html

于 2013-04-22T17:24:14.833 に答える
0

何が起こるかを確認するための短い実験を次に示します。

create function determin_rand (i integer) 
returns float DETERMINISTIC
return rand();

create function not_determin_rand (i integer) 
returns float 
return rand();

select determin_rand(1) as d1 , determin_rand(1) as d2, 
  not_determin_rand(1) as nd1, not_determin_rand(1) as nd2

0.00850549154   0.831901073456  0.133989050984  0.174242004752

値が異なるため、関数は毎回呼び出されます。最初の関数で決定論的と宣言しましたが、違いはありませんでした。

さまざまなバージョンの mysql で試してみるために、sqlfiddle を作成しました。

http://sqlfiddle.com/#!2/a8536/2

于 2013-04-22T17:32:21.887 に答える