1

我试图找到一种有效的方法来使用 JCL 在大型机上使用 DB2 迁移表。当我们更新我们的应用程序以使架构发生变化时,我们需要迁移数据库以匹配。

我们过去所做的基本上是创建一个新表,从旧表中选择,删除原始表并将新表重命名为原始名称。

不用说,当表很大(其中一些很大)时,这不是一个非常高性能的解决方案。

对于 DB2 的最新版本,我知道您可以做一些简单的事情,比如改变列类型,但是我们有迁移作业,需要对数据做更复杂的事情。

例如,考虑我们想要将两列合并为一列 ( firstname + lastname -> fullname) 的情况。别介意这样做不一定是个好主意,只是想当然地认为这是我们需要做的事情。可能对数据进行任意复杂的转换,基本上可以对select语句进行任何操作。

我的问题是这个。DB2unload实用程序可用于将表中的所有数据提取到几个数据集(load用于重新加载数据的 JCL 和数据本身)。有没有一种简单的方法(或任何方法)来按摩这个输出,unload以便在重新加载数据时进行这些任意更改?

我假设我可以load以某种方式修改 JCL 成员和数据成员来实现这一点,但我不确定这有多容易。

或者,更好的是,这个unload/load过程本身可以做到这一点而不必直接按摩成员吗?

有没有人有这方面的经验,或者有关于描述如何做到这一点的红皮书或红皮书(或任何其他来源)的指针?

除了之外,还有其他(更好,显然)的方法unload/load吗?

4

2 回答 2

1

我假设我可以以某种方式修改加载 JCL 成员和数据成员来实现这一点,但我不确定这有多容易。

我相信你已经在你的问题中提供了答案。至于“这有多容易”的问题,这取决于您修改的性质。

SORT 实用程序(DFSORT、SyncSort 等)现在具有非常复杂的数据操作功能。我们使用这些来移动数据,用一个值替换另一个值,组合字段,拆分字段等,尽管与您描述的上下文不同。

你可以用你的控制语句做类似的事情load,但这可能不值得麻烦。这将取决于您的更改程度。load如果您有必要的重复修改,那么尝试自动修改控制语句可能是值得的。如果修改都是“一次性的”,那么手动解决方案可能更方便。

于 2012-06-15T11:52:42.640 回答
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 实用程序在此处记录

于 2012-06-16T16:40:46.407 回答