Очень медленное выполнение при вызове функции - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть две функции.Вторая функция использует вывод первой функции.

Один:

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 голосов
/ 21 ноября 2018

Я обнаружил, что медленное выполнение было полным из-за того, что MySQL Workbench плохо обрабатывал большие наборы данных. После того, как я перенес все в BigQuery в Google Cloud, все заработало отлично.

ИЗБЕГАЙТЕ ОТ ФУНКЦИЙ ВЫЗОВА НА БОЛЬШИХ БАЗАХ ДАННЫХ В MySQL Workbench!

...