浏览 3889 次
锁定老帖子 主题:请教一个关于性能优化的问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-06-08
系统中存在着一些这样的表: 如运营商表:包含主要字段有[运营商代码(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取数据时看能不能再滤一些,这样可以减少些系统的开销。 但是无论使用哪种方法都得取得一个平衡点,不让系统顾此失彼,所以在这里请各位高手提供一下你们的方案。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-06-08
存储过程当然是首选
|
|
返回顶楼 | |
发表时间:2007-06-12
rtdb 写道 存储过程当然是首选 除了存储过程就没有别的方法了吗?用SQL能不能实现呢?
|
|
返回顶楼 | |
发表时间:2007-06-15
sam1982 写道 1.查重:即找出(如上表)以运营商代码为分组并按生效时间排序条件的记录,在这一组记录中如果有两条或者两条以上记录的生效时间和失效时间是在同一区间内或者说前一条记录的失效时间点+1秒大于后一条记录的生效时间点。
这里描述好像不清楚,如果后面只有条件没有,没有目的。 另外“生效时间和失效时间是在同一区间内”这句话怎么理解,是两个时间相等还是有其他条件,相等的话是精确在秒数量级吗 这操作在什么时候用,频度是多大,数据库中的数据目前变动率有多大 这些最好说明白,这样才好针对目标进行解决 |
|
返回顶楼 | |
发表时间:2007-07-13
qinysong 写道 sam1982 写道 1.查重:即找出(如上表)以运营商代码为分组并按生效时间排序条件的记录,在这一组记录中如果有两条或者两条以上记录的生效时间和失效时间是在同一区间内或者说前一条记录的失效时间点+1秒大于后一条记录的生效时间点。
这里描述好像不清楚,如果后面只有条件没有,没有目的。 另外“生效时间和失效时间是在同一区间内”这句话怎么理解,是两个时间相等还是有其他条件,相等的话是精确在秒数量级吗 这操作在什么时候用,频度是多大,数据库中的数据目前变动率有多大 这些最好说明白,这样才好针对目标进行解决 是这样的,重复的条件就是: 比如表中有 effc_time,expire_time,carrier等字段 然后有如下记录: effc_time expire_time carrier 2007/07/01 00:00:00 2009/01/01 23:59:59 a 2008/01/01 00:00:00 2010/01/01 23:59:59 a 2010/01/01 23:59:59 2017/01/01 23:59:59 a 2007/07/01 00:00:00 2009/01/01 23:59:59 b 2007/07/01 00:00:00 2009/01/01 23:59:59 c 在carrier 相同的情况下,第一条记录的effc_time+1秒>第二记录的expire_time即为重复的记录.而第一条记录的expire_time+1秒<>第二条记录的effc_time即为不连续.所以不连续应该是包括了重复的记录只是判断标准不一样.还有时间的计算是以秒级的 所以如前面给出记录中 重复记录为: effc_time expire_time carrier 2007/07/01 00:00:00 2009/01/01 23:59:59 a 2008/01/01 00:00:00 2010/01/01 23:59:59 a 不连续记录为: effc_time expire_time carrier 2007/07/01 00:00:00 2009/01/01 23:59:59 a 2008/01/01 00:00:00 2010/01/01 23:59:59 a 2010/01/01 23:59:59 2017/01/01 23:59:59 a 这两个操作在什么时候用? 这个很难说,基本上每个基础信息表和一些运营配置信息表的前台维护界面都会有操作,很难去捕捉用户什么时候会用.但是应该说用的机率不是很高吧.但之前的这个算法太慢了,现在是要优化它. 频度多大? 什么意思呢?使用的频度吗? 数据库中的数据目前变动率有多大? 这个跟数据库的变动率应该没有什么牵连的影响的,因为前面很多运营配置信息表都会有此操作的,而关于查重和导出不连续所涉及到的字段基本上是不会变的..... 不知道我这样说您清楚了吗? |
|
返回顶楼 | |