2013-01-16 3 views
1

함수를 여러 번 호출하면 매번 실행되거나 한 번만 실행되고 여러 시간 후에 값이 사용됩니까? 예 : MySQL 함수 호출

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')에서 사용되는 호출 및 시스템 레벨에서 실행됩니다

?

+1

매번 함수가 실행됩니다. 되돌아 오는 값이 캐시되는지 여부는 구현에 따라 다릅니다. – duffymo

답변

1

내가 아는 한 (MySQL 프로가 아님) 매번이 함수를 호출합니다. 당신의 expalin 계획은 그 문제를 보여 주어야합니다.

항상 같은 인수로 함수를 호출하는 경우 하위 쿼리를 통해 행당 한 번 쿼리하십시오.

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

DETERMINISTIC으로 함수를 선언하면 최적화 할 수 있습니다. 그러나 실제로는 결정 론적이어야합니다 :

루틴은 동일한 입력 매개 변수에 대해 항상 동일한 결과를 생성하고 그렇지 않으면 "결정적"인 것으로 간주되는 경우 "결정적"으로 간주됩니다. DETERMINISTIC 또는 NOT DETERMINISTIC이 루틴 정의에 제공되지 않은 경우, 기본값은 NOT DETERMINISTIC입니다. 함수가 결정적임을 선언하려면 명시 적으로 DETERMINISTIC을 지정해야합니다.

루틴의 성격 평가는 작성자의 "정직"에 기반합니다. MySQL은 DETERMINISTIC 선언 된 루틴에 비 결정적 결과가없는 명령문이 없는지 확인하지 않습니다. 그러나 루틴을 잘못 선언하면 결과에 영향을 주거나 성능에 영향을 미칠 수 있습니다. 비 결정적 루틴을 DETERMINISTIC으로 선언하면 옵티마이 저가 잘못된 실행 계획 선택을하도록하여 예기치 않은 결과를 초래할 수 있습니다. 결정 론적 루틴을 NONDETERMINISTIC으로 선언하면 g 용 불가능한 g 용 최적화가 g 용되어 성능이 저하 될 수 있습니다. MySQL 5.0.44 이전에는 DETERMINISTIC 특성이 허용되었지만 최적화 프로그램에서는 사용되지 않았습니다.

+0

귀중한 정보에 진심으로 감사드립니다.위의 예에서 한 가지를 명확히 할 필요가 있습니다. group by 절을 사용했으며 실제로는 511 행에 영향을 미치는 12 개의 저장 함수를 사용하여 84 개의 필드를 계산 중입니다. 이 상황에서 나는 명시 적으로 DETERMINISTIC으로 선언해야합니까? – Samiul

4

왜 함수의 값을 잡는 변수를 사용하지 않습니까? 예를 들어 :이 경우

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) 

우리 위의 예제에서 여러 줄 함수를 추가 할 수 있습니다.

+0

이 질문에 실제로 대답하지 않습니다. 게다가, CALL은 함수를 호출 할 수있는 "구분 기호 //"프롬프트 아래에있는 함수 인 – Sebastianb

+0

@Sebastianb이 아닌 프로 시저에만 해당됩니다. CALL을 사용하는 것은 프로 시저를 참조하기위한 예제 일뿐입니다. –