文章結合作者的工作需求,以在 IBM i 上的性能HTTP://www.aliyun.com/zixun/aggregation/20522.html">測試資料拷貝為例,探討了使用 CPYFRMIMPF 把以 del 格式的大資料拷貝到 IBMi 上的方法,並對 LOB 資料的處理、提高拷貝效率等問題進行了探討。
IBM i(以前稱作 OS400,i5 OS 等)是一個集成性作業系統,其最大的特點就是系統自身內嵌了資料庫 DB2。 作業系統本身使用到了 DB2 一些功能和特性,而 DB2 也用到了系統本身的底層功能。 正因為作業系統與資料庫的這種緊密耦合關係,使得 IBM i 在零售領域、金融領域等具有很好的表現。
作者在實際工作過程中,需要搭建客戶的類比資料環境及購物場景,即測試環境需要包含大量的產品、促銷等資訊,然後類比大量使用者併發的訪問商店以及購物,進而進行效能測試工作。 其中類比資料的載入是效能測試的前提條件。 測試資料由專門的工具生成,資料本身可以匯出為 SQL 檔或者 DEL 檔的格式。 SQL 檔可以直接通過 db2 -tf 的方式導入到資料庫當中,但是處理效率低下,需要花費較多的時間導入測試資料;DEL 檔案格式的資料具有較好的處理效率,在 DB2 LUW 版本當中,可以使用類似于如清單 1 的命令將資料拷貝到資料庫當中:
清單 1. 使用 LOAD 命令導入資料
load from PX_POLICY.del of del modified by chardel` insert into PX_POLICY("PX_POLICY_ID","STOREENT_ID","STATUS", "NA ME","IMPLCLS","XMLPARAM","OPTCOUNTER");
但是 DB2 for i 並不支援 LOAD 命令,所以不能用這個方法來拷貝資料。 但是 IBM i 上提供了一個叫 CPYFRMIMPF 的 CL 命令具有類似的功能。
CPYFRMIMPF
簡介
CPYFRMIMPF(Copy From Import File)可以將原始檔案中的全部或者部分記錄拷貝到目的檔案中,具有 FROMSTMF、TOFILE、ERRLVL 等參數,具體資訊請參考 IBM i 資訊中心。 在作者的測試資料處理過程當中,主要用到了如下幾個關鍵參數:
表 1 CPYFRMIMPF 關鍵參數
參數 作用 示例 FROMSTMF 指定源 DEL 檔,可以使用絕對路徑或者相對路徑 FROMSTMF('.. /load/ACPLGPSUBS_0.del') TOFILE 指定目的檔案,即資料庫 schema 中的一個表,格式為 <schema 名稱 >/< 表的名稱 > TOFILE(demo120/ACPLGPSUBS ) ERRLVL 錯誤記錄數 ERRLVL(*NOMAX) RMVBLANK 移除原始檔案欄位中的首尾空白字元 RMVBLANK(*BOTH) RPLNullVAL(*FLDDFT) 替換源 DEL 檔中欄位為 Null 的值 RPLNullV AL(*FLDDFT) RCDDLM 記錄分隔符號 RCDDLM(*LF) STRDLM 字串分隔符號 STRDLM('\`') FLDDLM 記錄之間的分隔符號 FLDDLM(',')
使用
CPYFRMIMPF 命令的使用可以直接在綠屏以 CL 格式命令運行,也可以在 QSH 下命令。 由於作者在測試過程中有多個 DEL 檔需要拷貝到相應的資料表中,所以採用在 QSH 下使用的方法,命令如清單 2 所示:
清單 2 QSH 下執行 CPYFRMIMPF
system "CPYFRMIMPF FROMSTMF('.. /load/ACPLGPSUBS_0.del') TOFILE(demo120/ACPLGPSUBS) ERRLVL(*NOMAX) RMVBLANK(*BOTH) RPLNullVAL(*FLDDFT) RCDDLM(*LF) STRDLM('\`')"
這裡有一點需要注意的是清單 2 中的 DEL 檔用的相對路徑,而該路徑是相對於當前 QSH 路徑的,不是相對於根路徑。
使用 CPYFRMIMPF 拷貝資料最佳實踐
獲取表的短名稱
DB2 for i 的資料表的名稱不能超過 10 個字元,超過 10 個字元的名稱會以短名稱的格式在 IBM i 上進行表示(前 5 個字元為表的全名的前 5 個字元,後 5 個字元為 00001 開始的編號,比如作者處理的資料庫中的一個表 A TTRDICTGRP 的短名稱為 ATTRD00001)。 如果多個表格的前 5 個字元相同,那麼就只能通過後面的數位進行區分,所以在拷貝資料之前必須獲得每個長表的短名稱。 該名稱可以在 iSeries Navigator 中獲得,如圖 1 所示:
圖 1 表的短名稱
去除約束
上文闡述了使用 CPYFRMIMPF 來進行資料拷貝的命令的格式,但是在實際使用過程中,由於需要拷貝大量資料到同一個 schema 的不同表格當中,而表格之間又往往存在外鍵等約束,所以我們不但需要保證測試資料本身的準確性, 即資料之間不違反約束條件,而且在插入的過程中按照一定的先後順序。 這樣一來,無形之中就降低了資料拷貝的效率。 一種替代的方法就是在拷貝資料之前去掉所有的約束條件,在拷貝完成之後,再加上去除掉的約束條件,而資料本身的準確性由資料來源保證,同時可以在加上約束條件之後使用 EDTCPCST 來説明檢查是哪個表的哪個欄位違反了外鍵約束條件。