2010-08-30 121 views
0

我在表Entity和Contact(對應於對象的不可靠)之間有1:1的關係。 fn_match(id)是返回布爾值的UDF,如果記錄匹配某些特殊條件(函數內的附加查詢),則返回true。這是一個查詢:用戶定義函數的mysql查詢 - 爲什麼函數被調用兩次?

select * 
from Entity a 
inner join Contact b on a.id = b.id 
where fn_match(a.i) 

它工作正常,但大幅加入戰利品的表現。 我已經添加了日誌記錄,並發現fn_match被調用了兩次,實體中的每個記錄都是fn_match(id)= true。我可以修復它爲函數頭添加確定性,但我曾經認爲訪問表數據的每個函數/存儲過程都是非確定性的。

這個問題的正確解決方案是什麼?

回答

0

您可以使用臨時表來存儲FROM Entity WHERE fn_match(i)的結果 - 但這可能不會提高性能。如果fn_match被調用兩次會損害性能,那麼對於實體中的每個項目只調用一次性能似乎並不是那麼好 - 因此可能更好地重新考慮函數。

+0

我同意每個記錄的調用函數都不利於性能。我無法解釋所有細節,但我真的被迫實施這種方式。 – burnall 2010-08-30 19:35:26