目前国内各电信运营商的计费系统基本都实现了省级集中,电信用户可以查询最近几个月的话费详单,但由于数据量过于庞大,各省运营商一般不再提供更早的话单查询服务,只是由各地市公司自行备份数据,自行处理。如果用户需要查询更早的话单记录,欠费催缴人员需要查询欠费用户多年以前的历史话单作为催缴凭据,以及其他一些类似的需要,怎么办?这是摆在各地市电信公司面前的一个问题。
背景分析
在地市级电信公司,历史话单数据有以下一些特性,也可以说是实现备份查询方案的关键点。
较快的数据增长速度:随着用户数和业务的扩展,话单数据容量呈几何级数增长,一般业务增长较快的地市公司,如果不压缩的话,最近几年的话单数据都有上百GB的容量。
静态数据:历史话单数据从计费系统落单后,除非出现重大变故,一般不易发生变化。用大型关系数据库存储这种数据略显浪费,而且数据库空间有限,不可能无限存储所有历史数据。
查询用户单一和不确定性:个别用户可能由于特殊的原因,需要查询自己很早以前的话单记录,或者是欠费催缴人员,需要查询某个欠费用户多年以前的历史话单作为催缴凭据,等等。
查询响应要求一般:用户对查询的响应速度要求不高,只要有数据就行,不会在乎等待十分钟还是一天。
5.查询时间范围跨度长:一般如果用户要查询自己的历史话单,时间跨度都会要求尽可能大,有可能要查自己从开户以来所有话单记录。图1是某地市电信公司某年的用户查询历史话单次数的分布统计,可以看出有两个台阶,查询半年前到一年半前的次数较多,查询一年半前到三年半前的次数次之,超过三年半的则趋近于零。
图1 某地市电信公司某年的用户查询历史话单次数的分布图
方案设计
方案概述
针对历史话单的上述特性,笔者提出了实现历史话单备份查询的基本思路。采用VisualFoxpro软件编程,将话单数据分月分号段存成一个个的dbf文件,并用压缩软件压缩,以硬盘和光盘存储压缩文件,在索引表中记录每个压缩文件的物理存放位置,实现最近两年数据从硬盘快速检索、两年以上数据从光盘海量检索的功能。
备份方法
将关系数据库的话单记录按月按万号段进行存储,如“13912340000~13912349999”就是一个万号段,先将该号段的数据存成一个dbf文件,文件名形如“1391234_YYYYMM.dbf”,并以gzip压缩,生成“1391234_YYYYMM.dbf.gz”,相同月份的文件都存放在目录名为当月“YYYYMM”的子目录内。
之所以按这种方式存储数据,是因为历史话单查询应用一般只查某个号码在某两个月份之间的数据。文件压缩可以节省磁盘空间,按月和按号段存储相当于数据库的分区操作,而且分区相对合适,压缩文件的字节量在几十MB到几百MB之间,相对一个上GB的大文件,可以节省不少文件拷贝、解压缩等操作的开销。随着用户数据量的增长,某些号段可能需要采用千号段甚至百号段的规模来形成压缩文件,这样可以将压缩文件的字节量控制在较小的区间内。另外由于话单数据过于庞大,单日数据另存为dbf就可能超过2GB,超出VisualFoxpro软件的处理极限,此时必须在关系数据库中将话单表按号段分区存储,再按分区导成dbf,即避免文件容量问题,又提高了导出速度。
在关系数据库中创建索引日志表,记录各月各号段压缩文件的相关信息,包括月份、文件名、起始号码、截止号码、存放路径、光盘标签,用于快速检索某个号码某月数据的存放路径或光盘标签。
查询方法
在关系数据库中创建查询日志表,用于记录每次查询的日志,包括号码、话单起始时间、话单截止时间、查询者、查询时间(如图2所示)。将光盘盘符作为一个预设参数,用于查询光盘数据。查询时以查询起始时间开始,依次检索当月历史话单压缩文件的存放位置和备份光盘的标签,如果文件不在本机硬盘,则提示插入相应标签的光盘到预设光驱盘符,在介质上找到文件后,将文件拷到临时目录,再解压缩,查询到记录后,追加另存到一个目标文件,如此反复直到循环结束,最后记录查询日志,并提交目标文件。查询单个号码历史数据的流程图如下。
图2 在关系数据库中查询单个号码历史数据的流程图
此备份查询方案针对历史话单特性,使用较少的投入,即可以较快地速度检索某个用户号码在任意时间段的话单记录,将各月话单数据一次性按号段压缩备份,平时只要避免介质损坏,备份文件就可以长期多次使用,从而实现了超长年限历史话单的快速查询。