首页 > 解决方案 > MariaDB 10.4 QUERY 或子查询优化

问题描述

有没有办法优化这种查询。

见下文。

Select KPI.*,
(select sum(NP_2g_crfs) from kpi_table where date_upload = '14/01/2020') as num_sum, 
(select sum(NP_2g_den) from kpi_table t1 where t1.id >= kpi_table .id) den_sum,
(select sum(NP_2g_num) from kpi_table t1 where t1.id >= kpi_table .id) num_sum, 
(select sum(NP_2g_num) from kpi_table t1 where t1.id >= kpi_table .id) /
(select sum(ROUND(NP_2g_den, 2)) from kpi_table t1 where t1.id >= kpi_table .id) kpi
from kpi_table 
WHERE date_upload = '14/01/2020'

加载时间长达 5 分钟,包含 5000 行。

提前致谢。

标签: mariadbquery-optimizationmariadb-10.4

解决方案


窗口函数 SUM() 应该比这些相关的子查询执行得更好:

SELECT *,
  SUM(NP_2g_crfs) OVER() num_sum, 
  SUM(NP_2g_den) OVER (ORDER BY id DESC) den_sum,
  SUM(NP_2g_num) OVER (ORDER BY id DESC) num_sum, 
  SUM(NP_2g_num) OVER (ORDER BY id DESC) / SUM(ROUND(NP_2g_den, 2)) OVER (ORDER BY id DESC) kpi
FROM kpi_table 
WHERE date_upload = '2020-01-14'

推荐阅读