【DFSORT/Syncsort】大量データを一瞬で間引く!INCLUDE/OMITカードによる爆速データフィルタリング術

朝焼けのオフィスバルコニーで、銀髪のIT格闘家じいじがゴールドのデジタルエネルギーを操り、不要なデータブロックを砕き飛ばし(OMIT)、必要なデータブロックを整列(INCLUDE)させているダイナミックなアイキャッチ。手にはJCLパンチカードとスマホ。技術の最適化。 【技術深掘り】メインフレーム遺産
データフィルタリングは俺のコンビネーション技だ。不要なデータは砕き、必要なデータだけを正確に手元に集める。これが爆速処理の極意だぜ。

おう、お前ら!今日もメインフレームのリングでデータとバチバチに殴り合ってるか?「IT格闘じいじ」だ!

27年メインフレーム(z/OS)の現場に立ってきた俺が、常々「もったいねぇな!」と思っている若手の動きがある。それが、数百万、数千万件もの膨大なデータが入った入力ファイルをそのままプログラム(COBOLやPL/I)に全部読み込ませて、プログラムの中のIF文で「あーでもない、こーでもない」とデータを間引いている姿だ。

そんな生ぬるいガードじゃ、CPU時間とI/O(入出力)の猛連打を食らって、システムが秒速でスタミナ切れ(リソース枯渇)を起こすぜ!甘い、ガードがガラ空きだ!

職人の戦い方は違う。ソート・プログラム(DFSORTやSyncsort)の「INCLUDE(インクルード)」と「OMIT(オミット)」という強力なカウンターパンチを使って、プログラムにデータを渡す前の「ソートフェーズ」で不要なデータを完全にシャットアウト(間引き)するんだ。

今回は、この爆速フィルタリングの技を伝授してやる。耳をかっぽじってよく聞きやがれ!

INCLUDEとOMIT:リングに上げるデータを選別する鉄拳

朝焼けのオフィスバルコニーで、銀髪のIT格闘家じいじがゴールドのデジタルエネルギーを纏った鉄拳を放ち、データのリング上で、必要なデータセット(INCLUDE)をリングへ押し込み、不要なノイズデータ(OMIT)を場外へ弾き飛ばしている。技術の最適化。
データを選別するのはプログラムじゃない、俺の鉄拳だ。INCLUDEでリングへ、OMITで場外へ。データ構造を理解した者だけが放てる、必殺のカウンターパンチだぜ。

大量のデータが詰まったファイルを処理するとき、一番大切なのは「無駄なデータに1ミリも触れないこと」だ。ソートエンジンの段階でデータを絞り込めば、後続のプログラムの処理時間は劇的に短縮される。

ここで使うのが、INCLUDEカードとOMITカードだ。この2つは表裏一体のコンビネーション技だな。

  • INCLUDE(データ取り込み):「指定した条件に一致するデータだけをリングに上げる(抽出する)」という技だ。例えば、特定の店舗コードや当月分のデータだけを狙い撃ちで集めるときに使うぜ。
  • OMIT(データ除外):「指定した条件に一致するデータをリングから叩き出す(除外する)」という技だ。解約済みのフラグが立っているレコードや、エラーデータを一瞬でゴミ箱に叩き込むときに大活躍する。

わざわざCOBOLで長大なコードを書かなくても、JCLの制御カードにたった1行書だけで、OS直結の爆速ソートエンジンが数百万件のデータをノータイムで間引いてくれるんだから、使わない手はねぇよな!

実戦でそのまま使える!100%正常動作のJCL&SYSINサンプル

朝焼けの東京バルコニーで、銀髪のIT格闘家じいじが検証済みのJCLパンチカードを手に自信満々に微笑む。空中のホログラムディスプレイには、固定長と可変長データのフィルタリングフローチャートが描かれ、JCL条件(拠点コードTOKYO、売上フラグ無効以外)やVB属性のRDW(4バイト)に対する「+4バイトガード」の正しい命令文(14,5,CH...)が緑に輝くシールドで示されている。アベンドS0C7を無効化し、完璧に抽出されたグリーンに輝く filtered dataが「100% verify OK」のシールドと共に整然と並ぶ。技術の最適化。現場を制する力。
概念を語るのは二流。一流は現場でコピペして動くJCLを置くぜ。VB属性の RDWA罠(死角)まで計算に入れた、完璧なフィルタリング・コンビネーションをな。オっしゃあ、100%verifiedだ!!!

口で言うだけなら誰でもできる。ここに現場のリングでそのまま100%正常動作する、動作検証済みのJCLとSYSIN(制御カード)のサンプルをぶち込んでおくぜ!

今回のコンビネーションは、「80バイトの固定長レコードから、10バイト目にある拠点コードが『TOKYO』であり、かつ30バイト目にある売上フラグが『0(無効)』以外のレコードだけをソートして抽出する」という実戦的なフォーマットだ!

//FILTERJB JOB (ACCOUNT),'SORT INCLUDE OMIT',CLASS=A,MSGCLASS=X
//* ===================================================================
//* IT格闘じいじ直伝:INCLUDE/OMITによる爆速フィルタリングJCL
//* ===================================================================
//SORTSTEP EXEC PGM=SORT
//SYSOUT   DD SYSOUT=*
//SORTIN   DD DSN=YOUR.PROJECT.MASTER.DATA,DISP=SHR
//SORTOUT  DD DSN=YOUR.PROJECT.FILTERED.DATA,
//             DISP=(NEW,CATLG,DELETE),
//             UNIT=SYSDA,SPACE=(CYL,(10,10),RLSE),
//             DCB=(RECFM=FB,LRECL=80,BLKSIZE=0)
//SYSIN    DD *
  INCLUDE COND=((10,5,CH,EQ,C'TOKYO'),AND,(30,1,CH,NE,C'0'))
  SORT FIELDS=(1,9,CH,A)
/*

【プロの解説:条件カードの軌道を見極めろ】

SYSINに書かれたこの2行のコンビネーションが、どうやってデータを仕留めているかステップ付きで具体例を解説するぜ。

① INCLUDE COND=((10,5,CH,EQ,C’TOKYO’),AND,(30,1,CH,NE,C’0′))

ここで強力な2連撃(複数条件)を叩き込んでいる!

  • 10,5,CH,EQ,C’TOKYO’:入力データの10バイト目から5バイト分が、文字(CH)として「TOKYO」と等しい(EQ)かを見ている。
  • AND:かつ(両方の条件を満たす必要があるぜ)。
  • 30,1,CH,NE,C’0’:30バイト目の1バイトが、文字(CH)として「0」と等しくない(NE:Not Equal)かを見ている。

この網に引っかかったクリーンなデータだけが、次のソート処理のリングに上がる権利を得るんだ。条件を逆にしたい場合は、頭を OMIT COND=… に変えれば、その条件に一致するゴミデータを一瞬で場外乱闘へ叩き出せるぜ!

② SORT FIELDS=(1,9,CH,A)

INCLUDEによって完璧に絞り込まれた、無駄のないデータに対してのみソートを実行する。1バイト目から9バイト目のキー情報を基準に、文字(CH)の昇順(A)で並び替える。

最初からデータ量が激減しているから、ソート処理自体もノーダメージかつ爆速で終わるフォーメーションだ!

若手がハマる現場の罠!比較演算子の指定ミスと「S0C7」の恐怖

朝焼けのオフィスバルコニーで、銀髪のIT格闘家じいじがゴールドのデータシールドを張り、若手エンジニアを宙に殴り飛ばす強力な「ABEND S0C7」の赤いエネルギーパンチをブロックしている。シールドには「Verified CONDITIONS (CH,EQ/NE)」と刻まれ、若手は赤いトゲ付きデータブロック(罠)に躓いてパニック。背景には東京のスカイライン。技術の最適化。現場を制する力。
ガードの甘い若手に、現場の罠(比較演算子のミス)がアッパーカットを食らわせやがった!だが心配すんな、俺の「防衛策(データシールド)」があれば、S0C7(アベンド)もノーダメージだぜ!オス!!!

おい、ここからがセコンドとして一番伝えておきたい「現場の罠」だ。油断してると強烈なアベンドカウンターを食らってマットに沈むことになるぜ。

罠その①:比較演算子の型指定ミスによる「すり抜け」

INCLUDEやOMITの条件を書くとき、データの属性(型)を勘違いして指定する若手がめちゃくちゃ多い。

例えば、パック十進数(PACKED DECIMAL)が入っている領域に対して、間違えて文字型(CH)として比較条件 EQ,C’100′ なんて書いてしまうミスだ。

これをやると、ソートエンジンは内部のバイナリデータを全く違う文字として解釈しちまう。結果、抽出されるべきデータがすべて「すり抜けて除外」されるか、あるいは全く関係のないゴミデータがリングに上がってしまい、後続の処理が全滅するんだ。

罠その②:数値データの位置ズレによる「S0C7アベンド」

さらに凶悪なのが、数値型の領域を正しく指定したつもりでも、その領域にスペース(空白)や想定外の文字が混入していた場合だ。

数値比較(PD:パック十進数や、ZD:ゾーン十進数)の条件を通るとき、システムが「おい、ここ数値の形になってねぇぞ!」と検知した瞬間、恐怖の**「S0C7(データ例外アベンド)」**が炸裂する。夜間本番バッチのリングでこれを食らうと、深夜3時に叩き起こされるハメになるぜ!

🔥 致命的な罠その③:VB属性(可変長ファイル)における「+4バイトの死角」

固定長(FB)のファイルから、可変長(VB)のファイルに対戦相手が変わったとき、ノーガードの若手は100%ノックアウトされる。

可変長ファイル(RECFM=VB)には、レコードの先頭にシステムが自動で付与する**「RDW(レコード記述語)」という4バイトの隠された領域**が存在するんだ。

設計書に「10バイト目から拠点コード」と書いてあるからといって、固定長と同じ感覚で INCLUDE COND=(10,5,CH,…) と指定した瞬間、終わりだ!

データがどのようにズレるか、以下の「固定長」と「可変長」のデータイメージの対比を見れば一発で理解できるぜ!

📊 固定長(FB)vs 可変長(VB)データイメージ対比表

レコード形式 バイト位置の構造(データイメージ) 正しいINCLUDE命令(開始位置)
固定長(FB) [1〜9: キー][10〜14: TOKYO][15〜80: データ…] INCLUDE COND=(10,5,CH,EQ,C’TOKYO’)
可変長(VB) [1〜4: RDW][5〜13: キー][14〜18: TOKYO][19〜: データ…] INCLUDE COND=(14,5,CH,EQ,C’TOKYO’)

どうだ?可変長(VB)は先頭に RDW(4バイト) が強制介入してくるから、データの中身全体が後ろに4バイト分押し出されてるだろ!

それなのに固定長と同じ感覚で 10 バイト目を指定しちまったら、実際にはキー情報の後ろの4バイト(5〜13の中の10〜13バイト目)と、TOKYOの先頭1バイトをガッチャンコして判定することになっちまう。これじゃあデータ位置はグチャグチャ、数値が含まれていれば一発でS0C7アベンド行き確定だ!

【プロの防衛策(ガードの固め方)】

この罠を完全に無効化し、クリーンヒットを奪うための防衛策はこれだ!

データ定義(レイアウト)の属性(CH/PD/ZD)をトリプルチェックしろ:

ソート対象の領域が「文字」なのか「パック十進数」なのか「ゾーン十進数」なのか、コピペ元の設計書やCOBOLの登録集(COPY句)を穴があくほど見ろ。目分量で「多分数字だからZDだろ」なんて打つ奴は、職人のリングじゃ一瞬でKOされるぜ。

VB属性のときは、頭の中で必ず「+4」のステップを刻め:

処理するファイルが可変長(VB)だと分かった瞬間、ソートカードの開始位置指定は「設計書の位置 + 4バイト」に脳内デバッグしろ!設計書の10バイト目なら、ソートカードに書べきは 14 だ。この4バイトのガードを固めるだけで、位置ズレのパンチはすべて不発に終わるぜ!

安全のために文字比較(CH)でワンクッション挟む:

もし数値領域にゴミ(スペースなど)が混ざる可能性がある汚れたファイルを扱うなら、いきなりPDやZDで比較しちゃいけねぇ。まず INCLUDE や OMIT の前段で、その領域がスペース C’ ‘ でないことを文字比較(CH)で担保するか、16進数表記(X’40’など)を使ってゴミデータを確実に弾くガードを固めてから、本命の数値比較を繰り出すんだ!

まとめ:戦う前に勝負を決める、それが職人のデータフィルタリングだ

朝焼けの東京バルコニーで、銀髪のIT格闘家じいじがゴールドのデジタルエネルギーを操り、システムの混乱(アベンド、ノイズ)を一撃で「ガード(INCLUDE)」および「砕き飛ば(OMIT)」し、完全に最適化され、整然と並んだ検証済みデータフロー(gold data queues)を構築している。右手にはJCLパンチカードとスマホ。systemsの最適化。現場を制する力。
戦う前に勝負を決める、それが職人のデータフィルタリングだ。俺のコンビネーション(ガード&カウンター)が決まった瞬間、バッチ処理のリング(システム)は完全に支配下だぜ。オス!!!

ソート処理の前にデータを極限まで絞り込むINCLUDEとOMITは、メインフレームという過酷なリングを生き抜くために必須の「高速化コンビネーション」だ。

プログラム側で重たいIF文を連打する前に、ソートエンジンの段階で不要なデータを1件残らず叩き出す。この「戦戦(前処理)」の段階での緻密なガードとカウンターの組み立てこそが、数千万件のバッチ処理を「秒」で終わらせる職人の流儀なんだぜ。

特に、可変長(VB)ファイルを扱うときの「RDW(4バイト)」の死角は、一度叩き込まないと何度も同じパンチを食らう鬼門だ。もし現場で位置ズレやS0C7アベンドに頭を抱えて消耗している若手がいたら、お前がこの対比イメージとJCLをコピペして手渡してやりな。

「甘いぜ、ガードがガラ空きだ」と、職人の圧倒的なスピードと精密なデータコントロールを見せつけてやろうじゃねえか。

リソースを制する者が、バッチ処理を制す。しっかりガードを固めて、次のシステムもバチバチに勝ちにいこうぜ!オっしゃあ!!!

関連記事:

【z/OS】プログラム不要!DFSORT/SYNCSORTでできる全機能まとめ(JCLサンプル付き)
27年のメインフレーム経験を持つIT格闘じいじが、z/OSのソートユーティリティ(DFSORT/SYNCSORT)の全機能をJCLサンプル付きで徹底網羅!並び替え、重複削除(SUM)、OUTREC、OUTFILからICETOOLの戻り値制御まで、プログラム不要の高速データ処理術を解説。

コメント

タイトルとURLをコピーしました