ORACLE SCROLL CURSOR引起临时表空间增长

最近一段时间在解决一个大数据采集的问题,同事离职遗留的代码,不要太复杂 。


背景是这样的,有个系统专门负责采集原始档案数据,即有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,以便后面再次移动游标时使用。

你可能感兴趣的:(Oracle)