Kettle数据处理的过程中难免会遇到性能瓶颈,因此性能及效率的提升成为摆在面前的问题,因此笔者罗列一些常用的优化建议。
- kettle优化
- 索引的正确使用
- 数据抽取SQL优化
kettle优化
- 尽量使用数据库连接池;
- 尽量提高批处理的commit size;
- 尽量使用缓存,缓存尽量大一些(主要是文本文件和数据流);
- Kettle 是Java 做的,尽量用大一点的内存参数启动Kettle;
- 可以使用sql 来做的一些操作尽量用sql ;
- Group , merge , stream lookup ,split field 这些操作都是比较慢的,想办法避免他们.,能用sql 就用sql;
- 插入大量数据的时候尽量把索引删掉;
- 尽量避免使用update , delete 操作,尤其是update , 如果可以把update 变成先delete , 后insert ;
- 能使用truncate table 的时候,就不要使用delete all row 这种类似sql合理的分区,如果删除操作是基于某一个分区的,就不要使用delete row 这种方式(不管是delete sql 还是delete 步骤),直接把分区drop 掉,再重新创建;
- 尽量缩小输入的数据集的大小(增量更新也是为了这个目的);
- 尽量使用数据库原生的方式装载文本文件(Oracle 的sqlloader , mysql 的bulk loader 步骤);
- 尽量不要用kettle 的calculate 计算步骤,能用数据库本身的sql 就用sql ,不能用sql 就尽量想办法用procedure , 实在不行才是calculate 步骤;
- 要知道你的性能瓶颈在哪,可能有时候你使用了不恰当的方式,导致整个操作都变慢,观察kettle log 生成的方式来了解你的ETL操作最慢的地方;
- 远程数据库用文件+FTP 的方式来传数据 ,文件要压缩。(只要不是局域网都可以认为是远程连接)。
索引的正确使用
在ETL过程中的索引需要遵循以下使用原则:
当插入的数据为数据表中的记录数量10%以上时,首先需要删除该表的索引来提高数据的插入效率,当数据全部插入后再建立索引。
避免在索引列上使用函数或计算,在where子句中,如果索引列是函数的一部分,优化器将不使用索引而使用全表扫描。
避免在索引列上使用 NOT和 “!=” ,索引只能告诉什么存在于表中,而不能告诉什么不存在于表中,当数据库遇到NOT和 “!=” 时,就会停止使用索引转而执行全表扫描。
索引列上用 >= 替代 >
高效:select * from temp where deptno >=4
低效:select * from temp where deptno >3
两者的区别在于,前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录。
数据抽取的SQL优化。
- Where子句中的连接顺序。
- 删除全表是用TRUNCATE替代DELETE。
- 尽量多使用COMMIT。
- 用EXISTS替代IN。
- 用NOT EXISTS替代NOT IN。
- 优化GROUP BY。
- 有条件的使用UNION-ALL 替换UNION。
- 分离表和索引。
<div class="person-messagebox">
<div class="left-message"><a href="">
<img src="" class="avatar_pic" username="zitian886">
</a></div>
<div class="middle-message">
<div class="title"><span class="tit "><a href="" data-report-click="{"mod":"popu_379","ab":"new"}" target="_blank">紫色架构</a></span>
<!-- 等级,level -->
<img class="identity-icon" src=""> </div>
<div class="text"><span>原创文章 59</span><span>获赞 13</span><span>访问量 11万+</span></div>
</div>
<div class="right-message">
<a class="btn btn-sm bt-button personal-watch" data-report-click="{"mod":"popu_379","ab":"new","extend1":"个人信息未关注"}">关注</a>
<a href="" target="_blank" class="btn btn-sm bt-button personal-letter">私信
</a>
</div>
</div>
</div>