l 彻底。仅仅减少重单是不够的,必须保证整个系统中没有一条重单。记得有一个省曾经采用过这么一种删重技术:任何一条话单都跟其前后的几百条话单进行比较,如果没发现相同,就认为不是重单。据说,这种技术的依据是重单的分布符合某种正态分布。这样的所谓“删重”显然让人难以置信,因为这种办法最多只能删除一部分交换机产生的重单,根本不可能保证没重单,这样的“删重”显然是无法满足要求的。
l 可靠。对于删重,可靠的含义是:无论是在正常情况下,还是在某些模块出错的情况下都应该保证没有重单。因为计费系统从来都不是在一个理想的状态下运行的,经常会有意想不到的情况出现,所以只有可靠的删重方法才能彻底删重,才有实用价值。
l 实时。理想的删重是来一条话单就能判断其是否重单,如果做不到这一点,至少也要求做到在每天的汇总前删除重单。如果到了月底再去删除本计费月中的重单,可能会造成错误的高额,错误的实时扣款,甚至错误的停机。假如一个用户某天打了几个电话,银行帐号上有足够的钱,却因汇总前没删除重单,结果被告知帐号上钱不够了,说不定接着就被停机。这样即使到月底把重单删了,用户能答应吗?
l 性能高。计费系统每天要处理大量的数据,速度非常关键,因此必须保证所用的删重技术有尽可能高的效率。
l 简单。删除重单的方法越简单越好,因为简单的方法往往比较高效,而且不太容易出错,实现起来也容易。许多问题上,好的解决方法往往是简单的,就象《神雕侠侣》中独狐求败留下的玄铁重剑:“重剑无锋,大巧不工”。
l 有利于其他功能的实现。数据位于现代信息处理的中心,数据模型是稳定的,而处理是多变的。对于计费系统,数据库是一切功能的核心,因此必须从全局出发来考虑数据的设计。而话单删重技术对计费系统数据库设计有着决定性的影响,但在考虑删重的同时也要考虑系统其他功能的实现,比如汇总,高额,实时话单查询,话话单量监测,以及许多话务统计的要求。
l 在数据库设计上,主要采用话单表存放话单,用查重表删重。查重表只包含删重需要的关键字段,比如IMSI号和通话时间,在这张表中保留1-2个月的话单,查重表采用数据分区技术,按话单日期进行分区。
l 当入库程序收到一条批完价的话单后,先往查重表插入,如果插入成功,那么再向话单表中插入。由于查重表相对较小,且采用了ORACLE 8中的唯一索引表(本身既是索引又是表)技术和数据分区技术,因此往查重表插入的速度应该还比较快。
l 话单按处理日期分别存放到话单表不同的分区中。为什么按处理日期存放呢?因为每个月计费时都会有上个计费月,甚至更早以前的隔月延时话单,而实际向用户收费根据的是处理日期。如果话单按话单日期分区存放,到月底为了找出在本月计费的话单,那么即使对隔月延时话单加了标志位,也要把几个月内处理的所有话单都找一遍,速度慢,麻烦,且不可靠。所以这种技术要求话单按处理日期存放。
l 话单表分成三类,分别是日表,待处理延时话单表和隔月延时话单表。日表一天一张,存放每天的话单,比如:7月7日的话单就入到表CDR_SM_07_07表中。待处理延时话单表只有一张,无论是当月的还是隔月的延时话单都先入到这张表中,这张表名为CDR_SM_00_00。隔月延时话单表一个月一张,存放处理后的隔月延时话单。这样对于任何一个计费月,这个计费月的日表中的话单加上这个月的隔月延时话单表中的话单就是在这个月计费的话单。
l 入库前,话单按话单日期分成不同文件。入库时,当天的话单入当天的表,不用作任何判断。对于非当日的话单,要先查询数据库中的标志判断那一天的话单是否已经汇总。若未汇总,那么入日表,否则就入到待处理延时话单表中。
l 日表有主键,因此正常情况下对于当日话单不需要作任何的删重操作。在特殊情况下,如计费主机因故障停了几天的情况下,采用先用SQL *LOADER的DIRECT PATH方式快速导入,然后重建索引的方式来删除重单。
l 每天在做完日表汇总后处理待处理延时话单表CDR_SM_00_00,删除延时话单中可能的重单并汇总。处理时,将话单日期分类并作批量处理。对于当月延时话单,只需要跟相应日表去比较,看看是否有重单,有重则删之。对于隔月延时话单,除跟日表比对外,还要跟隔月延时话单表去比对,因为同样的延时话单可能今天来明天接着出现。删完重后将将当月延时话单插入相应日表,将隔月延时话单插入隔月延时话单表中。这样就可以删除延时话单中的重单。
显然,日表比对方式能删除所有可能的重单。那么这种方式与前面的查重表删重方式相比,到底有哪些优点呢?
l 彻底。不仅能删除交换机生成CDR时,分拣批价时的产生的重单,而且可以删除入库时重复插入的话单。即使入库程序重复插入,也能保证最后没有重单。
l 可靠。查重表删重容易在出错情况下造成话单表和查重表的不一致,而日表比对删重没这个问题。
l 效率高。在计费系统里,98%的话单是当天的话单,当月延时话单不到总量的2%,而隔月延时话单更少。虽然日表比对方式在删延时话单时速度相对较慢,但由于延时话单量很少,因此对系统性能影响很少。而且由于对占总话单数98%的当日话单删重操作速度非常快,所以系统总体性能比较高。而查重表删重对所有的话单都向查重表中插一遍以查重,因此速度比较慢。
l 抓住了删重的关键。就象解决大多数的问题一样,删重也要抓住关键。既然在原始CDR生成时,采集时,话单分拣和批价时,入库时都可能产生重单,因此在这之前删重没有任何意义。而汇总时要求数据库中没有重单,因此删重的关键环节应该在话单入库后,在每日汇总前。日表比对技术抓住了删重的关键环节。
l 简单。日表比对删重是一种比较简单的删重方式。因为这种技术很关键的一条是任何一条话单最后只在一张表中存在,所以不存在几张表中保持一致的问题。在错误处理时,不需要同时对话单表和查重表操作,因此也不必为保持这两者的同步而费脑筋。