为什么这个查询需要很多时间来执行?

为什么这个查询需要很多时间来执行?

问题描述:

有没有更好的方法来写这个?为什么这个查询需要很多时间来执行?

select Date, NeName, KPINAME, SUB_TYPE1, KPI 
from ggsn_kpi_2017 
where date 
    in ('2017-08-19', '2017-08-18', '2017-08-17', '2017-08-16', '2017-08-15', 
    '2017-08-14', '2017-08-13') 
    and KPINAME in('SM_SUCC_SESS_ACT_GGSN', 'SM_FAIL_SESS_ACT_GGSN', 'SM_SUCC_SESS_ACT_P_GW', 'SM_FAIL_SESS_ACT_P_GW', 
    'SM_SUCC_SESS_ACT_SAE_GW', 'SM_FAIL_SESS_ACT_SAE_GW', 
    'SM_DOWNLINK_BYTES_M2M', 'SM_UPLINK_BYTES_M2M') 

    group by Date, NeName, KPINAME 

    union 

    select Date, NeName, KPINAME, SUB_TYPE1, KPI 
    from ggsn_kpi_2016 
    where date in ('2017-08-19', '2017-08-18', '2017-08-17', '2017-08-16', 
    '2017-08-15', '2017-08-14', '2017-08-13') 
    and KPINAME in('SM_SUCC_SESS_ACT_GGSN', 'SM_FAIL_SESS_ACT_GGSN', 'SM_SUCC_SESS_ACT_P_GW', 
    'SM_FAIL_SESS_ACT_P_GW', 'SM_SUCC_SESS_ACT_SAE_GW', 
    'SM_FAIL_SESS_ACT_SAE_GW', 'SM_DOWNLINK_BYTES_M2M', 'SM_UPLINK_BYTES_M2M') 
    group by Date, NeName, KPINAME; 
+1

请编辑问题,正确格式化,为您正在使用的数据库添加标签以及查询计划,以及表格定义,索引等。因为没有人能说出任何关于它的信息。 –

+1

你需要更详细地解释你的问题。这个问题不是一个有效的StackOverflow问题。关于如何发布问题的指导原则在这里:https://stackoverflow.com/help/how-to-ask – Reeza

+2

你在'SELECT'中有'SUB_TYPE1,KPI',但它们不在'GROUP BY'中。你的查询没有意义。 –

在此查询中有一个明显的性能反模式。你有

where date in ('2017-08-19', '2017-08-18', '2017-08-17', '2017-08-16', 
'2017-08-15', '2017-08-14', '2017-08-13') 

如果dateDATETIMETIMESTAMP,OR DATE列,更改到

where date >= '2017-08-13' 
    and date < '2017-08-20' 

甚至

where date >= '2017-08-13' 
    and date < '2017-08-13' + INTERVAL 1 WEEK 

然后在(date, KPINAME)两个表创建索引。这将使您的WHERE子句至少部分sargable

此外,你似乎是误用GROUP BY。这跟集合函数一样,如MAX()AVG()。你的意思是ORDER BY

+0

此外,您在2017年检查'ggsn_kpi_2016'几天;这似乎是错误的? –