性能调优在整个工程中是很是重要的,也是很是有必要的。但有的时候咱们每每都不知道如何对性能进行调优。其实性能调优主要分两个方面:一方面是硬件调优,一方面是软件调优。本章主要是介绍Kettle的性能优化及效率提高。html
1、Kettle调优java
1、 调整JVM大小进行性能优化,修改Kettle定时任务中的Kitchen或Pan或Spoon脚本。mysql
修改脚本代码片断sql |
set OPT=-Xmx512m -cp %CLASSPATH% -Djava.library.path=libswt\win32\ -DKETTLE_HOME="%KETTLE_HOME%" -DKETTLE_REPOSITORY="%KETTLE_REPOSITORY%" -DKETTLE_USER="%KETTLE_USER%" -DKETTLE_PASSWORD="%KETTLE_PASSWORD%" -DKETTLE_PLUGIN_PACKAGES="%KETTLE_PLUGIN_PACKAGES%" -DKETTLE_LOG_SIZE_LIMIT="%KETTLE_LOG_SIZE_LIMIT%"数据库 |
参数参考:缓存 -Xmx1024m:设置JVM最大可用内存为1024M。 |
样例:OPT=-Xmx1024m -Xms512m函数 |
2、 调整提交(Commit)记录数大小进行优化post
如修改RotKang_Test01中的“表输出”组件中的“提交记录数量”参数进行优化,Kettle默认Commit数量为:1000,能够根据数据量大小来设置Commitsize:1000~50000。性能
3、 调整记录集合里的记录数
4、尽可能使用数据库链接池;
5、尽可能提升批处理的commit size;
6、尽可能使用缓存,缓存尽可能大一些(主要是文本文件和数据流);
7、Kettle是Java作的,尽可能用大一点的内存参数启动Kettle;
8、可使用sql来作的一些操做尽可能用sql;
Group , merge , stream lookup,split field这些操做都是比较慢的,想办法避免他们.,能用sql就用sql;
9、插入大量数据的时候尽可能把索引删掉;
10、尽可能避免使用update , delete操做,尤为是update,若是能够把update变成先delete, 后insert;
11、能使用truncate table的时候,就不要使用deleteall row这种相似sql合理的分区,若是删除操做是基于某一个分区的,就不要使用delete row这种方式(不论是deletesql仍是delete步骤),直接把分区drop掉,再从新建立;
12、尽可能缩小输入的数据集的大小(增量更新也是为了这个目的);
13、尽可能使用数据库原生的方式装载文本文件(Oracle的sqlloader, mysql的bulk loader步骤);
14、尽可能不要用kettle的calculate计算步骤,能用数据库自己的sql就用sql ,不能用sql就尽可能想办法用procedure,实在不行才是calculate步骤;
15、要知道你的性能瓶颈在哪,可能有时候你使用了不恰当的方式,致使整个操做都变慢,观察kettle log生成的方式来了解你的ETL操做最慢的地方;
16、远程数据库用文件+FTP的方式来传数据,文件要压缩。(只要不是局域网均可以认为是远程链接)。
2、索引的正确使用
在ETL过程当中的索引须要遵循如下使用原则:
1、当插入的数据为数据表中的记录数量10%以上时,首先须要删除该表的索引来提升数据的插入效率,当数据所有插入后再创建索引。
2、避免在索引列上使用函数或计算,在where子句中,若是索引列是函数的一部分,优化器将不使用索引而使用全表扫描。
3、避免在索引列上使用 NOT和 “!=”,索引只能告诉什么存在于表中,而不能告诉什么不存在于表中,当数据库遇到NOT和 “!=”时,就会中止使用索引转而执行全表扫描。
4、索引列上用 >=替代 >
高效:select * from temp where deptno>=4
低效:select * from temp where deptno>3
二者的区别在于,前者DBMS将直接跳到第一个DEPT等于4的记录然后者将首先定位到DEPTNO=3的记录而且向前扫描到第一个DEPT大于3的记录。
3、数据抽取的SQL优化
1、Where子句中的链接顺序。
2、删除全表是用TRUNCATE替代DELETE。
3、尽可能多使用COMMIT。
4、用EXISTS替代IN。
5、用NOT EXISTS替代NOT IN。
6、优化GROUP BY。
7、有条件的使用UNION-ALL替换UNION。
8、分离表和索引。