お手軽バッチ・パフォーマンス改善 – VI
データセットのI/O効率を上げる(続き)
VSAMデータセットのCIバッファーを増やす(シーケンシャル・アクセス)
VSAMデータセットでは、CIをアクセスするバッファーを増やすことで、一度にまとめてCIをアクセスできますから順次データセット同様にデバイスへのI/O回数を減らすことができます。特にESDSやKSDSのシーケンシャル処理では順次データセット同様に、その効果は大きいです。

グラフはバッファー数と実行時間および発行されたI/O回数と使用されたリージョン内メモリーサイズを示しています。実行時間はVSAMがデフォルトで設定するCIサイズ(18432バイト)でデフォルトのバッファー数の実行時間を1とした場合の、相対数値です。CIサイズを4KBに縮めるとそれだけで実行時間は2倍弱、I/O回数は4倍強に増えます。バッファー数を20個に増やせばやっと追いつく感じです。
VSAMもQSAM同様にバッファー数を単に多くすればよい、というわけではなくある程度のところで効果は頭打ちになります。VSAMではDATAコンポーネント・アクセスのデフォルト・バッファー数は2個です。VSAMでも大量のレコードが格納されたデータセットを順次アクセスするプログラムの場合、バッファー数を増やすことでデータセットのI/O処理の効率を上げることができます。CIサイズの大きなデータセットでは20から40個程度。CIサイズが小さい場合で40から80個程度。過去に試した結果では、それ以上増やしてもメモリー使用量の増加に見合うだけの実行時間短縮は望めませんでした。
デフォルトでも最小限のバッファリング制御がされていますが、性能に大きく寄与するほどではありません。しかし小さなCIサイズのデータセットほどバッファーを増やす効果は大きいので、機会があれば試してみて下さい。KSDSの場合で、主にキーによるランダム・アクセスをするが、たまにシーケンシャル・アクセスでの処理も行う、といったデータセットで小さめのCIサイズを選択しているような場合は、シーケンシャル・アクセス時にはバッファー数を増やすことで、大きなCIサイズ並のパフォーマンスを得られます。
DATAコンポーネントのバッファー数の変更は、JCLのDDステートメントにAMPパラメーターでBUFNDを追加することで行うことができます。
//SEQFILE DD DISP=SHR,DSN=dsname, // AMP='BUFND=20'
AMSのREPROやICEGENERではプログラム自身で最適なI/Oを行うのでJCLでのバッファー数指定は効果がありません。VSAMとPSデータセット間のロード/アンロードであればAMSのREPROではなく、ICEGENERユーティリティーでコピーした方がパフォーマンスは格段にいいです。従来からあるIEBGENERユーティリティーではなく、DFSORTによって提供されるICEGENERです。PSとVSAM間の相互コピーも簡単なJCLで行うことができます。