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

dfuffjeb  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(368)

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

  1. DELIMITER $$
  2. DROP FUNCTION IF EXISTS fp_splitfactor;
  3. CREATE FUNCTION fp_splitfactor_price (id CHAR(8), startdate DATE)
  4. RETURNS FLOAT
  5. BEGIN
  6. DECLARE splitfactor FLOAT;
  7. SELECT IFNULL(EXP(SUM(LOG(f.p_split_factor))),1) INTO splitfactor
  8. FROM fp_v2_fp_basic_splits AS f
  9. WHERE f.fsym_id = id AND f.p_split_date > startdate AND f.p_split_date < NOW();
  10. RETURN splitfactor;
  11. END$$
  12. DELIMiTER ;

第二个是:

  1. DELIMITER $$
  2. DROP FUNCTION IF EXISTS fp_splitadjprice;
  3. CREATE FUNCTION fp_splitadjprice (id CHAR(8), startdate DATE)
  4. RETURNS FLOAT
  5. BEGIN
  6. DECLARE splitfactor FLOAT;
  7. DECLARE splitadjprice FLOAT;
  8. DECLARE spinofffactor FLOAT;
  9. SET splitfactor = 1.0;
  10. SELECT fp_splitfactor(id, startdate) INTO splitfactor;
  11. SELECT (p_price * splitfactor) INTO splitadjprice
  12. FROM fp_v2_fp_basic_prices
  13. WHERE fsym_id = id AND p_date = startdate;
  14. RETURN splitadjprice;
  15. END$$
  16. DELIMITER ;

然后,我尝试执行一个查询,如下所示:

  1. SELECT
  2. p.fsym_id,
  3. b.p_co_sec_name_desc AS Company_Name,
  4. b.region AS Region,
  5. p.p_date,
  6. p.p_price AS Unadjusted_Price,
  7. fp_splitadjprice(p.fsym_id,p_date) AS Adjusted_Price
  8. FROM
  9. fp_v2_fp_basic_prices p
  10. LEFT JOIN (
  11. SELECT r2.region, b2.p_co_sec_name_desc, b2.fsym_id
  12. FROM fp_v2_fp_sec_coverage b2
  13. LEFT JOIN sym_v1_sym_region r2 ON b2.fsym_id = r2.fsym_id
  14. WHERE r2.region = "EUR") b
  15. ON b.fsym_id =p.fsym_id

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

6ss1mwsb

6ss1mwsb1#

我发现执行缓慢是由于mysql工作台不能很好地处理大型数据集造成的。一旦我把所有的东西都迁移到google云上的bigquery上,所有的东西都工作得很好。
不要在mysql工作台中对大型数据集调用函数!

相关问题