kettle效能及效率提升
阿新 • • 發佈:2019-01-09
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。
- 分離表和索引。