kettle —— 從 oracle 到 oracle的坑


  公司有個項目,是使用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保留,但是再從目標表查詢出全量數據,將這兩個流做比對,用“合並記錄”的組件將各種情況的記錄都標記出來,在后續的流程中可以使用組件來篩選和進行后續的操作。

    改造完成后的圖如下

    這樣,就將“需要更新”的,“需要插入的”,需要“標記為刪除的”分別篩選出來,單獨進行更細或者插入的操作了。
    然而,還是出現了新的問題,在“更新”和”同步“ 之后,速度仍然慢。

    保存出問題了,中間寫的沒有了,現在精簡的補充一下:

    解決方案: 

    建立索引——> 目標表(table_name,column_name)。

    update的速度——>大幅度提升。

    三、總結:

    ① 對於不通的方式,最多2天,不要再深入研究,問題一定不是在整個方向上。

    ② 解決問題要有邏輯性,哪怕在紙上寫出來,將問題一個個的羅列,解決,梳理,能對問題有個明確的方向。

    ③ 多上cnblog看看大神的數據庫筆記。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM