加入了一個數據匯聚分析展示的項目,其中數據抽取是一個很重要的環節,我接手之后發現kettle抽取速度越來越慢,不知道是服務器不給力還是數據庫壓力太大什么原因,在線搜索了很多優化方案:
1.調整JVM大小進行性能優化,修改Kettle定時任務中的Kitchen或Pan或Spoon腳本(選中kettle圖標-->右鍵-->編輯,修改參數設置);
2、 調整提交(Commit)記錄數大小進行優化;
如修改“表輸出”組件中的“提交記錄數量”參數進行優化,Kettle默認Commit數量為:1000,可以根據數據量大小來設置Commitsize:1000~50000;
3、 調整記錄集合里的記錄數;
4、盡量使用數據庫連接池;
5、可以使用sql來做的一些操作盡量用sql;
Group , merge , stream lookup,split field這些操作都是比較慢的,想辦法避免他們.,能用sql就用sql;
6、插入大量數據的時候盡量把索引刪掉;
7、盡量避免使用update , delete操作,尤其是update,如果可以把update變成先delete, 后insert;
這些都做了,發現依然沒有很大的改善,后來發現是我沒有注意第“5”條,下面就來說說具體的操作方式(主要是主鍵對比去增量抽取):

可以看到日志日期里面完成整個過程只需要95秒,我這張目標表有大概65萬的數據庫,表中有一百二十多個字段項,大小有五百多兆,這個速度相比之前還是很快的;
創建一個作業:
第一個步驟就是先將源表全量抽取到目標庫中的中間表;
第二個步驟就是刪除操作:對比中間表和本地表,刪除需要刪除的數據(這個不多說,大家應該都會的吧)
第三個步驟就是在左側核心對象中找到腳本-->SQL,這個是在所連接數據庫上執行所寫SQL


merge INTO KETTLE.AA_CDPF_CITIZEN t1 using KETTLE.A_CDPF_CITIZEN t2 ON ( t1.uuid = t2.uuid )
WHEN matched THEN
UPDATE
SET t1.birthdate = t2.birthdate,
t1.business_id = t2.business_id,
WHEN NOT MATCHED THEN
INSERT (
t1.uuid,
t1.birthdate,
t2.business_id
)
VALUES
(
t2.uuid,
t2.birthdate,
t2.business_id
)
這里將SQL貼出來(只列了部分字段供參考),注意目標表和中間表的順序,一定不要寫錯了,不然會報:>ORA-00904:標識符無效;這個SQL可以根據比對,如果存在且不匹配則修改,如果不存在則添加;修改和添加SQL后面可以根據需求添加條件;具體merge的用法,大家可以自行查詢,oracle真的是個很強大的數據庫,只要程序員實際需要的,都有相應的方法函數!
希望對大家有幫助,謝謝!
