为什么这个查询需要很多时间来执行?
问题描述:
有没有更好的方法来写这个?为什么这个查询需要很多时间来执行?
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;
答
在此查询中有一个明显的性能反模式。你有
where date in ('2017-08-19', '2017-08-18', '2017-08-17', '2017-08-16',
'2017-08-15', '2017-08-14', '2017-08-13')
如果date
是DATETIME
,TIMESTAMP
,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'几天;这似乎是错误的? –
请编辑问题,正确格式化,为您正在使用的数据库添加标签以及查询计划,以及表格定义,索引等。因为没有人能说出任何关于它的信息。 –
你需要更详细地解释你的问题。这个问题不是一个有效的StackOverflow问题。关于如何发布问题的指导原则在这里:https://stackoverflow.com/help/how-to-ask – Reeza
你在'SELECT'中有'SUB_TYPE1,KPI',但它们不在'GROUP BY'中。你的查询没有意义。 –