性能調優在整個工程中是很是重要的,也是很是有必要的。但有的時候咱們每每都不知道如何對性能進行調優。其實性能調優主要分兩個方面:一方面是硬件調優,一方面是軟件調優。本章主要是介紹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、分離表和索引。