性能调优案例 | 数据卸载看我的

Posted 厦开系统联盟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了性能调优案例 | 数据卸载看我的相关的知识,希望对你有一定的参考价值。



Q

有没有什么比较快速高效的数据卸载方法和工具?

对于ORACLE数据库,数据卸载和装载最高效的工具当属数据泵(expdp/impdp),但它们只能用于ORACLE自身数据库的转储,不够通用。如果实际工作中需要将ORACLE数据库中的表卸载为文本文件,或是将文本文件数据装载到ORACLE数据库中,就需要另找高明了。

将文本文件装载到ORACLE中,建议采用我们之前介绍的SQL*LOADER(参见:),通过合理设置参数它将是我们数据装载的一把利器。

Q

如果想把ORACLE数据卸载为文本文件,可有什么高招?

随着业务的不断发展,数据库中的数据越来越多,数据的迁移也越来越频繁。实际工作中可能会碰到将ORACLE数据库中几十G、上百G,甚至TB级别的数据卸载为文本文件,这时对数据卸载的性能就有很高的要求。


性能调优案例 | 数据卸载看我的结合自身的工作经历,本文将为大家推荐一个专业的大数据量文本导出工具:sqluldr2。

sqluldr2

sqluldr2可以到http://www.anysql.net中下载,它是楼方鑫使用C语言和OCI接口开发的一个工具,现已有多个版本更新,推荐使用linux版本。

本文将以linux64位的版本为例,介绍其用法和性能相关的参数设置,帮助大家高效完成数据卸载工作。

性能调优案例 | 数据卸载看我的


一、部署工具包
性能调优案例 | 数据卸载看我的

先将sqluldr2linux64.zip(84k)包上传到linux服务器的任一目录下,解压zip包,而后将sqluldr2linux64.bin重命名为sqluldr2:

性能调优案例 | 数据卸载看我的


二、使用方法和参数介绍
性能调优案例 | 数据卸载看我的

sqluldr2 keyword=value [ keyword=value ......]

参数列表:

性能调优案例 | 数据卸载看我的

性能调优案例 | 数据卸载看我的

user:必输参数,源数据库的用户名密码和连接串;

sql和query参数二选一,如果整表导出,可以直接使用query=table_name;如果导出的表有字段选择和过滤条件,建议使用sql参数,先将select语句先编辑为一个文件,而后使用sql=select文件名;

field:指定字段的间隔符,比如使用竖线分割:field='|',还可以使用ASCII码表示,默认是逗号。record指定记录的分隔符,默认就是回车换行,大多情况不再指定。

file:指定卸载的文件名,为了便于区别,建议都进行有意义的命名。同时建议使用.gz后缀,这样卸载后的文件会压缩为gz文件,减少空间占用,也便于文件传输和保存。如果使用其他后缀名将不进行压缩。log记录卸载日志,也建议进行指定,便于后续查看卸载情况。

head:默认是NO,即不打印出字段名,一般卸载后需要进行文件装载的操作都使用NO,避免装载时报错。如果为了保存数据且便于后续查看,可以考虑设置为YES,它将会在文本文件的第一行显示字段名称。

parfile:如果参数比较多,还可编辑一个文件存放参数,而后直接使用parfile。

其他参数都是选填参数,可不设置。由于我们使用此工具,主要用于大数据量的卸载,因此重点关注和性能相关的几个参数:

array、read、hash、sort、serial,合理设置这些参数可以更好地发挥出sqluldr2的功效。

array:fetch队列的大小,默认是50,最大2000,建议设置为2000,减少fetch的次数,提高导出性能。

read:指定Oracle一次读取的数据块数,默认是DB_FILE_MULTIBLOCK_READ_COUNT的值,建议设置为128,即一次读取出128个数据块。

sort:指定排序区大小,建议设置为256。

hash:指定hash区大小,建议设置为256。

serial:建议设置为1,即全表扫描时使用direct path read,提高select的效率。


三、数据卸载实战演练
性能调优案例 | 数据卸载看我的

了解完sqluldr2的用法和参数后,我们就可以开始进行实战演练了。建议使用sql的写法,并将常用的参数编辑为文件保存,这样卸载将会更为灵活。

◇ 先编辑卸数的SQL语句:

性能调优案例 | 数据卸载看我的

◇ 接着编辑一个存放参数的文件,后续可以考虑共用:

性能调优案例 | 数据卸载看我的

◇ 启动卸载进程:

./sqluldr2 test/test@testdbsql=t_obj.sql file=t_obj_0718.gz log=t_obj_0718.log parfile=par.txt

◇ 卸载日志:

性能调优案例 | 数据卸载看我的


四、卸载性能分析
性能调优案例 | 数据卸载看我的

卸载2G的数据,耗时206s,这些时间都消耗在了哪里呢?先跟踪SQL的执行耗时,可以看到每次执行SELECT耗时42s:

性能调优案例 | 数据卸载看我的

因此卸数的主要耗时是在写文本文件压缩文本文件上。想要提高性能建议使用网络带宽大、IO性能好的磁盘进行卸载操作

为了获得压缩的时间消耗,我们测试下不压缩卸数的性能情况:

./sqluldr2 test/test@testdb sql=t_obj.sql file=t_obj_0718.dat log=t_obj_07182.log parfile=par.txt

不压缩卸数日志:

性能调优案例 | 数据卸载看我的

通过压缩与非压缩比较,可以计算出各步骤耗时:

性能调优案例 | 数据卸载看我的

可以看到大部分时间都耗在文件压缩上,如果文本文件可以不压缩,那将可节省大量的时间。

性能调优案例 | 数据卸载看我的

实际工作中,为了减少存储空间占用和加快网络传输,大多都需要进行压缩,那是否还有优化途径?

方法总比困难多,压缩期间的主要消耗是CPU资源,且一个压缩进程只会占用一个CPU资源,因此只要CPU个数足够多,可以考虑启动多个卸数进程,充分利用CPU资源来并行完成压缩。实测卸载效率和进程数量基本成正比。

而且如果要卸载的表比较大,卸载为一个文件,对应文件将会很大,并不是最优的选择。并行卸载可以将其拆分为多个文件,减少了每个文件的大小,更有利于文件传输和后续的数据导入。

并行卸载的实现也很简单,只需将select语句进行切分,让select语句抽取不同的数据,而后启动多个sqluldr2进程,分别卸载出对应的数据即可。如果select语句较为耗时,还可对select语句加上并行度,提升select查询效率。


五、卸载性能再提升
性能调优案例 | 数据卸载看我的

我们取了一张2300万、近80G的表,分别启动1个2个4个6个进程进行测试:

性能调优案例 | 数据卸载看我的

性能调优案例 | 数据卸载看我的

性能调优案例 | 数据卸载看我的

随着进程数的增加,耗时基本呈线性下降:1个进程6000s,2个进程就只需3000s,4个进程1600s,6个进程就仅需1100s,耗时大约是1个进程的1/6。服务器的CPU和IO资源随着进程数的增加也基本呈线性增长。6个进程时卸载效率达70MB/s,80G的数据20分钟左右就可卸载完成。


六、项目实际应用
性能调优案例 | 数据卸载看我的

某系统存在将大表卸载为文本文件的需求,由于数据量大(200G左右),每次卸载需要10个小时

我们推荐项目组使用sqluldr2工具,将参数设置为前面的建议值,并启用8个并行进行卸载,卸数耗时降低到了1.5小时,满足了2小时的时间窗口要求!

性能调优案例 | 数据卸载看我的

性能调优案例 | 数据卸载看我的

总结:

工欲善其事,必先利其器。本文主要是和大家介绍sqluldr2这个牛X的卸数工具,并介绍了一些提升卸载效率的方法!

1、善用sqluldr2工具

2、合理设置sqluldr2的参数

3、启动多个sqluldr2进程,并行完成数据卸载任务。

希望对大家后续在实际工作中碰到需要卸数的操作时能有所帮助!


厦门开发中心测试与推广支持处 系统与非功能小组出品 

编辑:方妍




以上是关于性能调优案例 | 数据卸载看我的的主要内容,如果未能解决你的问题,请参考以下文章

SQL调优实战-常见性能调优案例介绍(第二期)

性能调优案例

性能调优案例

一文教会你数据库性能调优(附某大型医院真实案例)

教会你数据库性能调优(附某大型医院真实案例)

数据库性能调优大全(附某大型医院真实案例)