最近一段时间在解决一个大数据采集的问题,同事离职遗留的代码,不要太复杂 。
背景是这样的,有个系统专门负责采集原始档案数据,即有blob字段类型的表,数据xml类型,且经过zip压缩的。要求将数据取出后,解压,存储为文本文件。数据量至少为3000万。我发现只要是数据量达到一个量级,以前不是问题的,现在全是问题!!!
程序流程大至是这样的:
1、获取本表的总记录数,进行负载均衡,每个进程平均分配采集数据。
2、进程起来后,根据父进程的分配信息,开SCROLL CURSOR,然后将CURSOR移动到负载均衡所设定的值上。
3、子进程从CURSOR中取BLOB数据,解压,写文件。
在运行时,发现temp表空间在不断增长,如不足还会导致采集失败。temp需要300G。这是一个要命的问题,数据量会不断增长,temp 也是不断增长。
查了一天,也没找到原因。最后判断是CURSOR使用可能有问题,以前从来没用过SCROLL CURSOR,对其特性不了解。最后才发现是SCROLL CURSOR引起的temp 表空间增长。
因为SCROLL CURSOR是滚动游标,支持CURSOR的随意移动,这就导致CURSOR需要将选定的数据在fetch时,存储至temp,以便后面再次移动游标时使用。