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>