2013-01-16 30 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,可以進行一些優化。但它確實應該是確定的:

例行被認爲是「確定性」,如果它總是產生相同的結果對於相同的輸入參數,和「不確定性」,否則。如果在例程定義中既沒有定義也沒有定義,默認值是NOT DETERMINISTIC。要聲明一個函數是確定性的,你必須明確指定DETERMINISTIC。

對例程性質的評估基於創建者的「誠實」:MySQL不檢查例程聲明的DETERMINISTIC是否沒有產生非確定性結果的語句。但是,錯誤地聲明例程可能會影響結果或影響性能。將一個不確定的例程聲明爲DETERMINISTIC可能會導致優化器做出不正確的執行計劃選擇,從而導致意外的結果。將確定性程序聲明爲NONDETERMINISTIC可能會導致可用的優化不被使用,從而降低性能。在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,在「delimiter //」提示符下,我們也可以調用函數。使用CALL僅僅是一個參考程序的例子。 –