2012-06-15 39 views
1

我試圖找到一種使用JCL在大型機上使用DB2遷移表的有效方法。當我們更新我們的應用程序以使模式更改時,我們需要遷移數據庫以進行匹配。DB2/z加載/卸載可以更改數據和模式嗎?

我們過去一直在做的基本上是創建新表,從舊錶中選擇成,刪除原始和重命名新表原來的名稱。不用說,當表很大時(這些解決方案中的一些很大),這不是一個非常高性能的解決方案。

的DB2版本後,我知道你可以做簡單的事情,像ALTER列類型,但我們有需要做更復雜的東西在數據遷移工作。

比如考慮,我們希望兩列合併成一個(firstname + lastname -> fullname)的情況。不要介意這樣做不一定是個好主意,只要認爲這是我們需要做的事。可能有任何複雜的數據轉換,基本上你可以用select語句做任何事情。

我的問題是這樣的。 DB2 unload實用程序可用於將表中的所有數據拖入一對數據集(用於重新加載數據的load JCL以及數據本身)。有沒有簡單的方法(或任何方式)來按摩這個unload的輸出,以便在重新加載數據時進行這些任意更改?

我認爲我可以修改load JCL成員和數據成員以某種方式實現這一點,但我不確定這是多麼容易。

或者,更好的,可以在unload/load過程本身做到這一點,而無需成員直接按摩?

有沒有人有這方面的經驗,或有指向紅皮書或紅皮書(或任何其他來源),描述如何做到這一點?

是否有不同的(更好,顯然)這樣做其他unload/load

回答

1

正如您所指出的,從舊錶中選擇新表將會有非常差的性能。這裏表現不佳通常是由於插入到目標表中的成本相對較高(索引建立和RI執行)。 SELECT本身通常不是性能問題。這就是爲什麼當需要從頭開始填充大型表時,通常會執行LOAD實用程序,可能會更高效地構建索引,並且可能會延遲RI。

UNLOAD實用程序允許不受限制地使用SELECT。如果您可以使用標量和/或列函數來選擇數據來構建與新的表列定義兼容的結果集,則可以使用UNLOAD來執行數據轉換。在SYSIN中爲UNLOAD實用程序指定一個SELECT語句。類似:

//SYSIN DD * 
SELECT CONCAT(FIRST_NAME, LAST_NAME) AS "FULLNAME" 
FROM OLD_TABLE 
/* 

所得SYSRECxx文件將包含一個單一的列,它是確定的兩個列的級聯(concat函數的結果)和SYSPUNCH將包含FULLNAME一個 兼容列定義 - 轉換的柱新表的名稱。您只需在SYSPUNCH中編輯新的表名(這將默認爲TBLNAME)並加載它。儘量不要擺弄SYSRECxx數據或SYSPUNCH列定義 - 這裏的一個混亂可能會變得很難看。

運行LOAD實用程序 創建新表時使用REPLACE選項(我認爲默認是LOAD RESUME,在這裏不起作用)。通常在運行LOAD時將RI關閉是一個好主意,這樣可以提高性能,並且可以節省解決LOAD作業需要運行順序的難題。一旦完成,您需要驗證RI並建立索引。

LOAD實用程序記錄在案here

1

我認爲我可以修改負載JCL成員和數據成員以某種方式實現這一點,但我不知道這是多麼容易。

我相信你提供你的問題中的答案。至於「這將是多麼容易」的問題,這將取決於你的修改的性質。

排序實用程序(DFSORT,SyncSort等)現在有複雜的數據處理函數。我們使用它們來移動數據,將一個值替換爲另一個值,合併字段,拆分字段等,儘管它們與您所描述的背景不同。

你可以做你的load控制語句類似的東西,但可能不值得麻煩。這將取決於你的變化的程度。如果您有必要進行重複修改,則可能值得花時間嘗試自動修改load控制語句。如果所有修改都是「一次性」,那麼手動解決方案可能更爲方便。

相關問題