資料庫中有訂單表tb_order,其中有order_id和user_id和user_name等字段。
資料庫中有使用者資料表tb_user,其中有user_id和user_name等字段。
現在需要使用tb_user.user_name來更新tb_order.user_name,兩個表的關聯條件是tb_order.user_id = tb_user.user_id。
通常,在兩個表都靜止的時候,可以使用乙個update來解決,如下。
update tb_order
set user_name = (select user_name from tb_user u where u.user_id = tb_order.user_id);
但是,如果這兩個表的資料量較大,且兩個表都在生產頻繁使用的時候,乙個update語句會鎖表,且需要較長的時間,從而可能會導致正常的業務無法快速進行。
此時,就應該單獨遍歷tb_order表中的每一條記錄,然後根據tb_order.user_id去tb_user中查詢每一條記錄中的user_name,最後根據tb_order.order_id來更新tb_order.user_name;這個單獨遍歷的方式,雖然不能完全解決鎖表引起的問題,但是也可以較大概率避免。
一下是乙個用遍歷記錄的思路處理問題的kettle配置,這個配置模式,效率非常低。
思路如下:
1:將tb_order表中資料讀入記憶體
2:從記憶體中獲得乙個記錄中的字段值,並將這些值設定成kettle的變數
3:使用這些kettle變數來作為引數去tb_user中查詢出來user_name,並將結果寫入kettle變數
4:使用kettle中的變數,來對tb_order進行update操作
頂層配置是乙個job,裡面包含乙個轉換和乙個job,轉換實現了第1步的功能,job包含3個轉換,分別實現了第2、3、4步的功能。具體配置如下:
頂層配置,比較關鍵的部分就是,job的屬性設定是,一定要選中"執行每乙個輸入行":
轉換從tb_order獲得資料的配置。表輸入中使用的sql為:select order_id,user_id from tb_order
job通過user_id得到user_name的配置如下
設定變數就是思路中的第2步,將記憶體中的一條記錄寫入kettle中的變數,注意,欄位名需要和頂層的轉換中對應的查詢的名字一致,字段型別需要和實際的資料庫表的字段型別一致。設定變數的配置如下,我是通過獲取欄位的方式來讓其自動設定變數的。
轉換修改tb_order中的user_name的配置就是思路中的第4步,是乙個sql指令碼。配置資訊如下:
在中使用SQLDMO
曾幾何時,夥伴們為的公升級傷透了腦筋.往往程式的公升級趕不上資料庫的公升級 版本控制的好,這也許不是什麼問題,但對於很大一部分中國公司來說這是無法避免的 而有些n久以前的資料庫要使用新程式的時候,資料庫的公升級簡直就是無從下手.所以對比資料庫公升級的緊要性就逐漸的凸現出來.對於表和字段的公升級按道理...
Python中使用遍歷在列表中新增字典遇到的坑
已知列表li 定義乙個函式,將該列表按照其元素的value 值進行排序,並輸出結果 思路很清晰,新建乙個列表,然後遍歷取出字典的值加入到新的列表中,再通過遍歷,賦值字典,使用append方法依次新增到列表,這樣就是乙個按照value值排續.於是有了下面的 li def fun li li 1 接收v...
kettle在多環境中區分環境使用
kettle的kettle.properties可以根據環境新增值,job中使用變數,達到區分環境的效果。通常我們專案中每個環境的資料庫都是分開的,這個時候我們就需要根據環境來設定資料庫的連線資訊了,如 編輯kettle.properties 資料庫連線使用變數 這樣就能達到區分環境的效果。自定義修...