kettle —— 從 oracle 到 oracle的坑
Posted on 2019-07-09 10:00 haisongen 閱讀(...) 評論(...) 編輯 收藏
公司有個項目,是使用kettle從oracle上統計,再将結果跟oracle中目标表進行對比更新。接手後,走了一些彎路,中間各種嘗試都不盡如人意,也學了kettle的一些元件的用法。正好趁着機會記錄 一下。
一、背景:
需求其實很簡單,在源oracle中,有大批量的表,是使用定時排程從其他不同的資料庫(oracle,mysql,sybase,dameng,sqlserver)中将 “表資訊”,“字段資訊”,“注釋資訊”等中繼資料表,拉取過來,分别做好編号存儲。
而kettle要實作的功能:
① 則是從這些源資料表中,将表名、字段名、字段注釋、字段長度、字段類型等資訊關聯出來。
② 并與之前已經做好的一張結果表做關聯更新。
③ 将“中繼資料有變更”的表的四元素(type,length,primary,comment)資訊進行update。
④ 如果該字段已經沒有了被删除了,則有專用字段标記為"1"。
⑤ 如果是新來的字段,則insert插入目标表。
二、曆程:
1. 一開始,機敏的同僚使用了一個SQL腳本,用了oracle中的 merge using() matched ....用法,——如果查詢結果與目标結果的 table_name和 column_name關聯上,則直接将四元素update到目标表中;若沒關聯上,則直接insert到目标表中。
2. 問題初現: 初步的邏輯相當于:隻要關聯上,就必須update,這樣來說,沒有任何變化的字段,也要update一次,造成大量的update其實是可以避免的。而且已删除字段的标記也未實作。
3. 趟雷:
① 最開始,使用kettle的元件來實作SQL中的邏輯,就不貼圖了,太長了,而且運作起來的效率低的可怕,後被pass。
② 後來嘗試,将SQL優化:
建立臨時表;
join的資料的列裁剪;
都用了一遍,但是毫無卵用....效率仍然低(在真實生産環境上直接都跑不動了)
③ 後來嘗試了一個新的用法: kettle中有個元件叫“合并記錄”:

。 這個小老弟看着不起眼,其實很厲害——它可以将兩組資料流進行比對,一個原始的,一個“新來的”,用新來的流與原始的流做比對,并在新産生的流中做标記,标記出哪些是沒變的,哪些是新加的(new),哪些是删除了的(deleted),哪些是改變了的(changed)。
當時一看,這不就是為這需求量身打造的元件,直接用起來!
改造邏輯:
查詢的SQL保留,但是再從目标表查詢出全量資料,将這兩個流做比對,用“合并記錄”的元件将各種情況的記錄都标記出來,在後續的流程中可以使用元件來篩選和進行後續的操作。
改造完成後的圖如下:
這樣,就将“需要更新”的,“需要插入的”,需要“标記為删除的”分别篩選出來,單獨進行更細或者插入的操作了。
然而,還是出現了新的問題,在“更新”和”同步“
三、總結:
① 對于不通的方式,最多2天,不要再深入研究,問題一定不是在整個方向上。
② 解決問題要有邏輯性,哪怕在紙上寫出來,将問題一個個的羅列,解決,梳理,能對問題有個明确的方向。
③ 多上cnblog看看大神的資料庫筆記。。。