文章结合作者的工作需求,以在 IBM i 上的性能">测试数据拷贝为例,探讨了使用 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", "NAME","IMPLCLS","XMLPARAM","O
PTCOUNTER");
但是 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 的值 RPLNULLVAL(*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 开始的编号,比如作者处理的数据库中的一个表 ATTRDICTGRP 的短名称为 ATTRD00001)。如果多个表格的前 5 个字符相同,那么就只能通过后面的数字进行区分,所以在拷贝数据之前必须获得每个长表的短名称。该名称可以在 iSeries Navigator 中获得,如图 1 所示:
图 1 表的短名称
去除约束
上文阐述了使用 CPYFRMIMPF 来进行数据拷贝的命令的格式,但是在实际使用过程中,由于需要拷贝大量数据到同一个 schema 的不同表格当中,而表格之间又往往存在外键等约束,所以我们不但需要保证测试数据本身的准确性,即数据之间不违反约束条件,而且在插入的过程中按照一定的先后顺序。这样一来,无形之中就降低了数据拷贝的效率。一种替代的方法就是在拷贝数据之前去掉所有的约束条件,在拷贝完成之后,再加上去除掉的约束条件,而数据本身的准确性由数据来源保证,同时可以在加上约束条件之后使用 EDTCPCST 来帮助检查是哪个表的哪个字段违反了外键约束条件。