请让我知道你寻求什么样的信息来改进这个问题,而不仅仅是否决。
我有一个函数如下所示:
DELIMITER $$
DROP FUNCTION IF EXISTS f_splitadjprice;
CREATE FUNCTION f_splitadjprice (id CHAR(8), startdate DATE)
RETURNS FLOAT
BEGIN
DECLARE splitfactor FLOAT;
DECLARE splitadjprice FLOAT;
SELECT f_splitfactor(id, startdate) INTO splitfactor;
SELECT (f.p_price FROM fp_v2_fp_basic_prices as f WHERE f.fsym_id = id AND
f.p_date = startdate) * splitfactor INTO splitadjprice;
RETURN splitadjprice;
END$$
DELIMITER ;
拆分因子的函数为:
DELIMITER $$
DROP FUNCTION IF EXISTS f_splitfactor;
CREATE FUNCTION f_splitfactor (id CHAR(8), startdate DATE)
RETURNS FLOAT
BEGIN
DECLARE splitfactor FLOAT;
SELECT IFNULL(EXP(SUM(LOG(f.p_split_factor))),1) INTO splitfactor
FROM fp_v2_fp_basic_splits AS f
WHERE f.fsym_id = id AND f.p_split_date > startdate AND f.p_split_date <
NOW();
RETURN splitfactor;
END$$
DELIMiTER ;
函数fèu splitadjprice运行非常慢。大约14秒。我试着自己运行函数的各个部分。也就是说,函数调用f\u splitfactor并选择(f.p\u price from fp\u v2\u fp\u basic\u prices as f where f.fsym\u id=id and f.p\u date=startdate)。当在函数之外单独运行这两个函数时,它们需要0001秒才能运行。所以整个问题是,只要我想通过嵌套函数进行组合,就需要花费10万倍的时间?
1条答案
按热度按时间dgsult0t1#
解决方案是不在函数中调用表。总的来说,这似乎是不好的做法,但它是非常缓慢的。相反,应该尝试摆脱函数,直接在查询中执行函数。