我有一个查询,返回一些数据相关的一些线索,类似这样的东西
| 导联ID|铅市|领先城市排名|铅类|引导类别等级|铅值|
| - -----|- -----|- -----|- -----|- -----|- -----|
| 1|德里|一个|服装|一个|100-200|
| 2|孟买|B|服装|一个|0-100|
| 3|密拉特|一个|鞋|B| 200-500|
现在,根据lead_city_rank、lead_category_rank和lead_value的值,我必须为每行分配一个分数。所以我有一个主网格表,它告诉了不同参数组合的得分。
| 网格记录标识|网格城市等级|网格类别秩|栅极超前值|要分配的网格分数|
| - -----|- -----|- -----|- -----|- -----|
| 1|一个|一个|1000-2000|十个|
| 2|一个|一个|500-1000|二十个|
| 3|一个|一个|200-500|三十|
| 4|一个|一个|100-200|四十|
| 5个|一个|一个|0-100|五十|
| 六|一个|B| 1000-2000|六十|
| 七个|一个|B| 500-1000|七十|
| 八|一个|B| 200-500|八十|
| 九个|一个|B| 100-200|九十|
| 十个|一个|B| 0-100|一百|
大约有300种不同的组合。在这个表中,我创建了一个函数:
CREATE fn_get_lead_score(
in_city_rank CHARACTER VARYING,
in_category_rank CHARACTER VARYING,
in_order_value CHARACTER VARYING
)
RETURNS NUMERIC
IMMUTABLE
LANGUAGE PLPGSQL
AS $function$
DECLARE
my_score NUMERIC;
BEGIN
SELECT grid_score_to_assign INTO my_score
FROM grid_score_master
WHERE grid_city_rank = in_city_rank
AND grid_category_rank = in_category_rank
AND grid_lead_value = in_order_value;
RETURN my_score;
END;
$function$;
最后,我在原始查询中使用此函数来分配分数并选择前50个记录
SELECT *
FROM (SELECT lead_id,
lead_city,
lead_city_rank,
lead_category,
lead_category_rank,
lead_value,
fn_get_lead_score(lead_city_rank, lead_category_rank, lead_value) AS lead_score
FROM my_leads
WHERE user_id = 10) my_leads
ORDER BY lead_score ASC
LIMIT 50
但这种方法需要很多时间,特别是当有大约2-3万线索来自查询.因此该函数被执行2-3百万次(对于可能的300个组合)。
有没有其他优化的方法来做到这一点?
1条答案
按热度按时间chy5wohz1#
将函数从plpgsql转换为SQL函数可能会有所帮助。
对于优化器来说,plpgsql基本上是一个黑盒,因此您需要为函数调用支付开销。但是,SQL函数对优化器来说是清楚的,它可以内联函数?但是当@JNevill询问 * 为什么要为一个简单的连接实现一个函数 * 时?