慢速嵌套函数

41ik7eoe  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(327)

请让我知道你寻求什么样的信息来改进这个问题,而不仅仅是否决。

我有一个函数如下所示:

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万倍的时间?

dgsult0t

dgsult0t1#

解决方案是不在函数中调用表。总的来说,这似乎是不好的做法,但它是非常缓慢的。相反,应该尝试摆脱函数,直接在查询中执行函数。

相关问题