发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 大数据 扩展性 并发编程 事件驱动 分布式 CQRS

请教一个关于性能优化的问题

    
2007-06-08 14:20
赞助商链接

这段时间公司要我对以前一个老系统的一些模块的某些操作进行性能上的优化,但这方面没有什么经验,请教一下各位,问题是这样的:
系统中存在着一些这样的表:
如运营商表:包含主要字段有[运营商代码(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取数据时看能不能再滤一些,这样可以减少些系统的开销。

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




2007-06-13 09:49

不是很明白你的平衡策略。

依据我在数据库时代终结一文的观点,数据库SQL优化只是一种“苟延残喘”的做法,花10倍力气产生1的效率,重点还是对象化设计和资源控制和优化(cache等)。

性能调优     

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系管理员 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com