调用函数时执行速度非常慢

时间:2018-11-14 16:36:54

标签: mysql mysql-workbench

我有两个职能。第二个函数使用第一个函数的输出。

一个是:

DELIMITER $$
DROP FUNCTION IF EXISTS fp_splitfactor;
CREATE FUNCTION fp_splitfactor_price (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 ;

第二个是:

DELIMITER $$
DROP FUNCTION IF EXISTS fp_splitadjprice;
CREATE FUNCTION fp_splitadjprice (id CHAR(8), startdate DATE)
RETURNS FLOAT 

BEGIN
DECLARE splitfactor FLOAT;
DECLARE splitadjprice FLOAT;
DECLARE spinofffactor FLOAT;

SET splitfactor = 1.0;

SELECT fp_splitfactor(id, startdate) INTO splitfactor;

SELECT (p_price * splitfactor) INTO splitadjprice
FROM fp_v2_fp_basic_prices
WHERE fsym_id = id AND p_date = startdate;

RETURN splitadjprice;
END$$
DELIMITER ;

然后我尝试按以下方式执行查询:

SELECT 
p.fsym_id, 
b.p_co_sec_name_desc AS Company_Name,
b.region AS Region,
p.p_date,
p.p_price AS Unadjusted_Price,
fp_splitadjprice(p.fsym_id,p_date) AS Adjusted_Price
FROM
fp_v2_fp_basic_prices p
LEFT JOIN (
        SELECT r2.region, b2.p_co_sec_name_desc, b2.fsym_id
        FROM  fp_v2_fp_sec_coverage b2
        LEFT JOIN sym_v1_sym_region r2 ON b2.fsym_id = r2.fsym_id
        WHERE r2.region = "EUR") b
        ON b.fsym_id =p.fsym_id

因此,基本上我的查询调用了第二个函数,然后调用了第一个函数以将值返回给查询。虽然执行速度非常慢,但是我不明白为什么会这样?

1 个答案:

答案 0 :(得分:0)

我发现,由于MySQL工作台不能很好地处理大型数据集,因此执行缓慢是完全的。在将所有内容迁移到Google Cloud上的BigQuery之后,一切都可以正常运行。

远离在MySQL Workbench中调用大型数据集的功能!