首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

怎么提高GROUP BY分组查询效率

2013-09-07 
如何提高GROUP BY分组查询效率最近工作中遇到一个性能问题,自己搞了好久还是没搞定,拿到论坛上来,希望各位

如何提高GROUP BY分组查询效率
最近工作中遇到一个性能问题,自己搞了好久还是没搞定,拿到论坛上来,希望各位大虾给点意见。
查询的SQL如下:
SELECT A,B,C,D,COUNT(1) FROM T WHERE C=@C AND D IN (@D) GROUP BY A,B
因为数据量比较大,所以这条SQL效率就变得特别慢,而且这个是用在页面查询上的,分页后每次查询都要花到8到9秒钟,页面卡死在那边,希望高手们帮小弟解答,小弟这边先谢过了。 性能 sql group?by
[解决办法]

引用:
Quote: 引用:

建索引,然后尽可能的过滤掉不符合条件的数据,然后再分组

下面是实际用到的SQL,请帮我看一下,索引什么的已经加过了,没多大效果
SELECT
  DEALER_ID,
  DEALER_BUSCODE,
  DEALER_NAME,
  DEALER_STATUS,
  OFFER_ID,
  OFFER_NAME,
  CHANNEL_ID,
  SUB_CHANNEL_ID,
  DISTY_ID,
  DISTY_BUSCODE,
  DISTY_NAME,
  REGION_CODE,
  REGION_NAME,
  O_ACTIVATION_TIME,
  P_ACTIVATION_TIME,
  ACTIVATION_DATE,
  STATE_CODE,
  STATE_NAME,
  PACKAGE_ID,
  PACKAGE_NAME,
  SALES_PIC,
  MSISDN,
  COUNT(1)
FROM UM2_ACTI_DTL_201305
WHERE OFFER_TYPE IN(1,3)
    AND ACTIVATION_TYPE = 3
    AND OFFER_ID IN(20000001,20000031,20010010)
    AND PACKAGE_ID IN(322,197,326,566,318,576,277,374,377,581)
    AND CHANNEL_ID IN(1,2,4)
    GROUP BY DEALER_ID,PACKAGE_ID,ACTIVATION_DATE


你这样的sql不能执行吧。 除了group by的列 ,其它选择的列必须要有统计函数的吧,类似于sum,average之类的
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

针对此SQL语句,可在C、D字段建索引,A、B建组合索引

这个我已经试过了,加索引效果甚微,查询效果还是一样的慢。

贴上SQL
SELECT
  DEALER_ID,
  DEALER_BUSCODE,
  DEALER_NAME,
  DEALER_STATUS,
  OFFER_ID,


  OFFER_NAME,
  CHANNEL_ID,
  SUB_CHANNEL_ID,
  DISTY_ID,
  DISTY_BUSCODE,
  DISTY_NAME,
  REGION_CODE,
  REGION_NAME,
  O_ACTIVATION_TIME,
  P_ACTIVATION_TIME,
  ACTIVATION_DATE,
  STATE_CODE,
  STATE_NAME,
  PACKAGE_ID,
  PACKAGE_NAME,
  SALES_PIC,
  MSISDN,
  COUNT(1)
FROM UM2_ACTI_DTL_201305
WHERE OFFER_TYPE IN(1,3)
    AND ACTIVATION_TYPE = 3
    AND OFFER_ID IN(20000001,20000031,20010010)
    AND PACKAGE_ID IN(322,197,326,566,318,576,277,374,377,581)
    AND CHANNEL_ID IN(1,2,4)
    GROUP BY DEALER_ID,PACKAGE_ID,ACTIVATION_DATE



OFFER_ID CHANNEL_ID 有建索引的话 试下这样:

像这样 内容不多的in你用 = 试试看,如果不行我也没办法了额,不了解业务,也不知道应用场景,不好说。


另: 你这查询返回多少数据?
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

针对此SQL语句,可在C、D字段建索引,A、B建组合索引

这个我已经试过了,加索引效果甚微,查询效果还是一样的慢。

贴上SQL
SELECT
  DEALER_ID,
  DEALER_BUSCODE,
  DEALER_NAME,
  DEALER_STATUS,
  OFFER_ID,
  OFFER_NAME,
  CHANNEL_ID,
  SUB_CHANNEL_ID,
  DISTY_ID,
  DISTY_BUSCODE,
  DISTY_NAME,
  REGION_CODE,
  REGION_NAME,
  O_ACTIVATION_TIME,
  P_ACTIVATION_TIME,
  ACTIVATION_DATE,
  STATE_CODE,
  STATE_NAME,
  PACKAGE_ID,
  PACKAGE_NAME,
  SALES_PIC,
  MSISDN,
  COUNT(1)
FROM UM2_ACTI_DTL_201305
WHERE OFFER_TYPE IN(1,3)
    AND ACTIVATION_TYPE = 3
    AND OFFER_ID IN(20000001,20000031,20010010)
    AND PACKAGE_ID IN(322,197,326,566,318,576,277,374,377,581)
    AND CHANNEL_ID IN(1,2,4)
    GROUP BY DEALER_ID,PACKAGE_ID,ACTIVATION_DATE



OFFER_ID CHANNEL_ID 有建索引的话 试下这样:

像这样 内容不多的in你用 = 试试看,如果不行我也没办法了额,不了解业务,也不知道应用场景,不好说。


另: 你这查询返回多少数据?

in语句的地方用=我也试过,没什么效果。
该查询返回的数据在17w左右


17W 的话,慢是正常的,不慢反而不正常了哦~~ 怎么提高GROUP BY分组查询效率

热点排行