mysql - 调用函数时执行非常慢
问题描述
我有两个功能。第二个函数使用第一个函数的输出。
一种是:
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
所以基本上我的查询调用第二个函数,然后调用第一个函数以便向查询返回一个值。虽然执行速度非常慢,但我不明白为什么会这样?
解决方案
我发现由于 MySQL 工作台不能很好地处理大型数据集,所以执行速度很慢。将所有内容迁移到 Google Cloud 上的 BigQuery 后,一切都运行良好。
远离在 MySQL Workbench 中调用大型数据集的函数!
推荐阅读
- sql-server - SQL CASE 表达式没有在 3 列中选择最大值,MAX 也不是
- java - 如何将 Liferay 6.2 portlet 升级到 Liferay 7.2
- spring - 带有谷歌扳手的春季批处理,没有内存数据库
- regex - 在 ReactJS 中的 axios 中模拟 url 中的数字
- javascript - 如何使用复制按钮复制 innerHtml 结果
- javascript - Javascript倒计时中的日期
- sql-server - 从 SQL Server 导出到 Postgres 错误:列是布尔类型,但表达式是整数类型
- kotlin - 如何观察协程通道是否挂起?我需要关闭它吗?
- c - Win32 CryptoAPI 使用 RSA 算法
- pyspark - 无法在 Spark 结构化流中写入聚合输出