时间是非常宝贵的,当你使用exp处理大数据量时一定会有所感受,oracle在处理exp时提供了几个参数,设置得当的话,某些层面上可以大幅提高数据的导出效率:
1、导出方式处理:
* 常规路径(Conventional path)
* 直接路径(Direct Path)
常规路径导出是exp默认的导出方式,在这种方式下,exp要处理的数据需要经过sql select语句的方式提取,将数据读取到缓存池,经由Evaluating Buffer 处理后返回到EXport客户端,最后才被写入Dump文件。
前面的实验都是基于常规路径操作,对于大数据量下常规路径的导出,要提高处理速度,最重要的参数是BUFFER。该参数用来指定执行导出时,处理数据所用的缓存区大小,以字节为单位。这个参数变相用来控制导出时记录数组单次最大能加载的记录数。
缓存区大小与加载记录数之间可以通过下列公式换算:
缓存区大小=纪录数组大小* 记录行最大长度
以下是验证BUFFER的作用,以数据库中CSDN表为例(网上下载来做试验,无其它用处),该表有670万记录量,占用空间1.7G,首先试试不指定buffer参数,直接导出需要花费多长时间:
1、没有指定buffer参数
导出csdn表:
导出完成,用时需2分多钟:
2、指定buffer参数:
导出数据所需时间,只需要1分多的时间了,可以说是成培的优化:
是不是越大越好呢?增大buffer参数:
但效果好像还不是很理想,一样是一分多钟:
以下继续增加,但还是一样,实验表时当buffer参数增大到一定大小时,如果再增加对导出数据的时间是没影响的。
2、直接路径导出也可以提高导出数据效率的:
直接路径导出使用,在exp中添加参数direct=y即可,该参数值默认为n。同时还有另一参数值对直接路径导出有影响的:recordlength,该参数用来指定export的I/O buffer,以字节为单位,最大不超过65535,一般执行直接路径导出时,建议直接将recordlength参数值设置为65535,以下实验:
导出的文件所需时间,也是1分多钟,算是达到预期的效果,当然在现实生产环境中,数据量会更大,提高一倍的速度就会更明显了:
exp常见问题:
1、导出时提示EXP-00091错误
前面已经提过,可以参考前面方法解决
2、导出数据时提示ORA-00904错误
执行导出的客户端数据库版本为10.2.0.4,服务器端数据库版本为10.2.0.3,大版本相同,只是小版本稍有差异。会报此错,所以在执行exp时客户端版本不能高于服务器的版本。
版本不同导致的错误提示通常会是ORA-06550。
3、执行导出时莫名停顿,但dump文件疯涨。
exp工具毕竟上了年纪,对于external table这样的新特性支持不。我们知道外部表在创建时也分为两种类型:一种是传统方式oracle_loader,与sql*loader一脉相承,另一种是10g后新推出的oracle_datapump方式。
对于前者,exp在执行导出时,只能导出表定义,不会导出实际的数据(毕竟数据是存储在外部的嘛),相对还好,总算该对象还能顺利处理;而对于后者就更麻烦了,不仅不导数据,连处理表定义都有问题,所以就会出现上述现象。这是oracle的一个bug,oracle10.2.0.3及以上版本数据库中不存在该问题,因此如果你在操作中遇到该问题,要么在导出时跳过外部表对象,要么升级数据库版本了。
本文转自pimg200551CTO博客,原文链接: http://blog.51cto.com/pimg2005/851637,如需转载请自行联系原作者