kettle性能及效率提升

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。
  • 分离表和索引。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值