首页 > 解决方案 > 调用函数时执行非常慢

问题描述

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

一种是:

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

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

标签: mysqlmysql-workbench

解决方案


我发现由于 MySQL 工作台不能很好地处理大型数据集,所以执行速度很慢。将所有内容迁移到 Google Cloud 上的 BigQuery 后,一切都运行良好。

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


推荐阅读