1

JCL を使用して、メインフレーム上の DB2 でテーブルを効率的に移行する方法を見つけようとしています。スキーマが変更されるようにアプリケーションを更新する場合、それに合わせてデータベースを移行する必要があります。

私たちが過去に行ってきたことは、基本的に新しいテーブルを作成し、古いテーブルから選択して、元のテーブルを削除し、新しいテーブルの名前を元の名前に変更することです。

言うまでもなく、テーブルが大きい場合 (およびテーブルの一部が非常に大きい場合)、これは非常に高性能なソリューションではありません。

DB2 の最近のバージョンでは、列タイプの変更などの単純なことを実行できることはわかっていますが、データに対してより複雑なことを行う必要がある移行ジョブがあります。

たとえば、2 つの列を 1 つに結合したい場合を考えてみましょう ( firstname + lastname -> fullname)。そうすることが必ずしも良い考えではないことは気にしないでください。基本的に、ステートメントで実行できることは何でも、データに対して任意に複雑な変換を行うことができます。select

私の質問はこれです。DB2ユーティリティを使用して、すべてのデータをテーブルからいくつかのデータ セット (データの再ロードに使用される JCL とデータ自体)unloadにプルすることができます。データをリロードするときにこれらの任意の変更が行われるように、この出力をマッサージloadする簡単な方法 (または任意の方法) はありますか?unload

これを達成するために JCL メンバーとデータ メンバーを何らかの方法で変更できると思いloadますが、それがどれほど簡単かはわかりません。

それとも、unload/loadメンバーを直接操作することなく、プロセス自体でこれを行うことができますか?

誰もこれを経験したことがありますか、またはこれを行う方法を説明するレッドブックまたはレッドペーパー (またはその他のソース) へのポインタを持っていますか?

以外にこれを行う別の(より良い、明らかに)方法はありunload/loadますか?

4

2 に答える 2

1

これを達成するためにロード JCL メンバーとデータ メンバーを変更できると思いますが、それがどれほど簡単かはわかりません。

私はあなたがあなたの質問の中で答えを提供したと信じています。「それがどれほど簡単か」という質問に関しては、変更の性質によって異なります。

SORT ユーティリティ (DFSORT、SyncSort など) には、非常に高度なデータ操作機能が備わっています。これらを使用して、データを移動したり、ある値を別の値に置き換えたり、フィールドを結合したり、フィールドを分割したりします。ただし、説明しているものとは異なるコンテキストで使用します。

制御ステートメントで同様のことを行うこともできますがload、それを行う価値はないかもしれません。変更の程度によって異なります。load繰り返し変更が必要な場合は、制御ステートメントの変更の自動化を試みる価値があります。変更がすべて「1 回限り」の場合は、手動で解決する方が適切な場合があります。

于 2012-06-15T11:52:42.640 に答える
1

お気づきのように、古いテーブルから新しいテーブルへの SELECT は、パフォーマンスが非常に悪くなります。ここでのパフォーマンスの低下は、通常、ターゲット テーブルへの挿入 (インデックスの作成と RI の適用) のコストが比較的高いことが原因です。通常、SELECT 自体はパフォーマンスの問題ではありません。これが、大きなテーブルに最初からデータを入力する必要があり、インデックスがより効率的に構築され、RI が延期される可能性がある場合に、一般に LOAD ユーティリティが推奨される理由です。

UNLOAD ユーティリティでは、SELECT を無制限に使用できます。スカラー関数や列関数を使用してデータを選択し、新しいテーブルの列定義と互換性のある結果セットを作成できる場合は、UNLO​​AD を使用してデータ変換を行うことができます。UNLOAD ユーティリティーの SYSIN に SELECT ステートメントを指定します。何かのようなもの:

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

結果の SYSRECxx ファイルには、識別された 2 つの列 (CONCAT 関数の結果) を連結した単一の列が含まれ、SYSPUNCH には FULLNAME の互換性のある列定義 (新しいテーブルの変換された列名) が含まれます。必要なことは、SYSPUNCH で新しいテーブル名を編集し (これはデフォルトで TBLNAME になります)、それをロードするだけです。SYSRECxx データや SYSPUNCH 列の定義をいじらないようにしてください。

LOAD ユーティリティを実行して新しいテーブルを作成するときに REPLACE オプションを使用します (デフォルトは LOAD RESUME で、ここでは機能しないと思います)。多くの場合、LOAD を実行するときに RI をオフにしておくことをお勧めします。これにより、パフォーマンスが向上し、LOAD ジョブを実行する必要がある順序を理解するという頭痛の種が解消されます。終了したら、RI を検証してインデックスを作成する必要があります。

LOAD ユーティリティは、ここに文書化されています

于 2012-06-16T16:40:46.407 に答える