【问题标题】:why this query takes so much time to execute?为什么这个查询需要这么多时间来执行?
【发布时间】:2018-01-28 19:02:54
【问题描述】:

有没有更好的写法?

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;

【问题讨论】:

  • 请编辑问题,正确格式化,添加您正在使用的数据库的标签,以及它的查询计划以及表定义,索引等。因为它没有人可以说什么关于它。
  • 您需要更详细地解释您的问题是什么。这个问题作为 StackOverflow 问题无效。关于如何发布问题的指南在这里:stackoverflow.com/help/how-to-ask
  • 您在SELECT 中有SUB_TYPE1, KPI ,但它们不在GROUP BY 中。您的查询没有意义。
  • 只是猜测,您没有正确的索引。根据您提供的信息,没有太多机会提供更好的建议。
  • 一些建议 - 为什么在没有聚合功能时使用 Group by。确保有适当的索引。

标签: mysql sql query-performance


【解决方案1】:

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

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

【讨论】:

  • 此外,您正在查看ggsn_kpi_2016 2017 年的几天;这似乎是错误的?
猜你喜欢
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
相关资源
最近更新 更多