日期:2014-05-18  浏览次数:20715 次

请教一个性能优化的问题
这段时间公司要我对以前一个老系统的一些模块的某些操作进行性能上的优化,但这方面没有什么经验,请教一下各位,问题是这样的:
系统中存在着一些这样的表:
如运营商表:包含主要字段有[运营商代码(carrier_cd),生效时间(eff_tm),失效时间(ex_tm).....](在这里只举一个表,还有其他类似这样的表)。
现在系统有两个这样的操作:查重,导出不连续;
1.查重:即找出(如上表)以运营商代码为分组并按生效时间排序条件的记录,在这一组记录中如果有两条或者两条以上记录的生效时间和失效时间是在同一区间内或者说前一条记录的失效时间点+1秒大于后一条记录的生效时间点。
2.导出不连续:跟查重操作差不多。这里就不描述了。

然后,现在的系统是这样的处理的,先用Sql找出运营商代码存在重复的记录,因为如果运营商代码不重复的话也就是只有一条记录也不存在重复,如下SQL:
    select   *   from   Carriers   where   carrier_cd   in  
  (select   carrier_cd   from   carriers   group   by   carrier_cd   having   count(*)   >   1)
  order   by   carrier_cd,eff_tm
取出这些记录后在程序中再进行如下处理:
  1.将记录进行分组:
  也就是将取出来的记录如果carrier_cd相同的记录就放在同一个list中(即一个组),然后再这些分组后的数据放在一个总HashMap或者List(系统以前实现的得很乱)。
  代码大概如下:
  List <Carrier>   list   =   getList()//根据上面SQL取出的记录
  HashMap   groupData   =   new   HashMap();
  for   (Carrier   car:list)   {
          String   carrier_cd   =   car.getCarrierCd();
          List   groupList   =   null;
          if   (groupData.containKey(carrier_cd))   {
                  groupList   =   (List)groupData.get(carrier_cd);                  
          }   else   {
                  groupList   =   new   Arraylist();
                  groupData.put(carrier_cd,groupList);
          }
          groupList.add(car);
  }
  2.找到重复记录(这里用了两重的for)
  迭代总的HashMap或者List,在每一组中通过比较找出重复的记录。
  Set   set   =   groupData.keySet();
  List   repatRecord   =   new   ArrayList();
  for   (String   key   :   set)   {
          List   groupedList   =   groupData.get(key);
          for   (Carrier   car   :   groupedList)   {
                    //比较第一条失效时间+1秒是否大于下一条记录的生效时间
                      ..........
          }  
}

上面的解决办法如果在数据不多的情况下是没有问题的,但是系统是老系统,也就是说有使用年代已久有很多记录,比如说运营商表(这是个大表)可能每个运营商都会有重复的情况,也就是说如上的解决方法,第一步从DB取出的记录就有几万条了,这样是肯定是不行的。
然后我想了几种方法(但只是想而已,不知道可不可行):
1。使用DB的存储过程来实现;
2。完全使用SQL来过滤;
3。还是按照上面的解决方法,但在SQL取数据时看能不能再滤一些,这样可以减少些系统的开销。

但是无论使用哪种方法都得取得一个平衡点,不让系统顾此失彼,所以在这里请各位高手帮帮忙提供一下你们的方案。




------解决方案--------------------
建议你的SQL中不要用Having最好用Where来代替。