我正在尝试使用JCL找到一种在大型机上使用DB2迁移表的有效方法。当我们更新我们的应用程序以使模式发生更改时,我们需要迁移数据库以匹配。
我们过去所做的基本上是创建一个新表,从旧表中选择,删除原始表并将新表重命名为原始表。
毋庸置疑,当表格很大(并且其中一些非常大)时,这不是一个非常高性能的解决方案。
对于后面的DB2版本,我知道你可以做一些简单的事情,比如改变列类型,但我们有迁移工作需要对数据做更复杂的事情。
例如,考虑我们要将两列合并为一列(firstname + lastname -> fullname
)的情况。不要紧,这样做不一定是个好主意,只是理所当然地认为这是我们需要做的事情。可能存在任意复杂的数据转换,基本上你可以用select
语句做任何事情。
我的问题是这个。 DB2 unload
实用程序可用于将表中的所有数据提取到几个数据集(用于重新加载数据的load
JCL和数据本身)。是否有一种简单的方法(或任何方式)来按下unload
的输出,以便在重新加载数据时进行这些任意更改?
我认为我可以以某种方式修改load
JCL成员和数据成员来实现这一点,但我不确定它会有多容易。
或者,更好的是,unload/load
进程本身可以做到这一点而无需直接按摩成员吗?
有没有人有这方面的经验,或者有关于描述如何做到这一点的红皮书或红皮书(或任何其他来源)的指示?
与<{1}}相比,其他有不同(更好,更明显)的方法吗?
答案 0 :(得分:1)
我假设我可以以某种方式修改加载JCL成员和数据成员来实现这一点,但我不确定它会有多容易。
我相信你已经在你的问题中提供了答案。至于“那将是多么容易”的问题,这将取决于你修改的性质。
SORT实用程序(DFSORT,SyncSort等)现在具有非常复杂的数据操作功能。我们使用这些来移动数据,将一个值替换为另一个值,组合字段,拆分字段等,尽管与您描述的内容不同。
您可以使用load
控制语句执行类似操作,但这可能不值得。这取决于您的更改程度。如果您需要重复修改,则可能值得花时间尝试自动修改load
控制语句。如果修改都是“一次性”,那么手动解决方案可能更为便利。
答案 1 :(得分:1)
正如您所注意到的,从旧表到新表的选择将具有非常差的性能。这里表现不佳通常是由于插入目标表(索引构建和RI执行)的成本相对较高。 SELECT本身通常不是性能问题。这就是为什么当需要从头开始填充大表时,通常会推广LOAD实用程序,可以更有效地构建索引并延迟RI。
UNLOAD实用程序允许不受限制地使用SELECT。如果可以使用标量和/或列函数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