システム決定ブロックサイズ

システム(z/OSのDFSMS)によって決定されたデータセットのブロックサイズです。今日のMVS(z/OS)は、データセットを作成するDASDボリュームの特性に合わせて、最適な長さのブロックサイズを決める機能を持っていて、SDB:System-Determined Block size:システム決定ブロックサイズと呼ばれています。
データセット作成時に、JCLのBLKSIZEパラメーターなどに0(ゼロ)を指定することでSDBが自動計算されます。

SDBは、基本的にデータセット・スペースを割り当てるDASDボリュームのトラックを最も効率よく使うようにそのサイズが決められます(PDSEの場合はアクセス用バッファー効率に関して最適化される)。3390型DASDはトラック長が56,664バイトですが、データセットに許容される最大のブロック長は32,760なので、1トラックに2ブロック格納できる最大サイズが計算されます。固定長の80バイト・レコードなら27920バイトのブロック長になり、可変長レコードなら27998バイトのブロック長です。PDSEの場合は、データセットに許容される最大のブロック長である32760が採用されます(実際のトラック上には4KB単位に物理レコードが書かれる)
今日では、ブロックサイズが長いと仮想記憶を沢山使うので、その分リージョンが圧迫される、という考え方はあまり重みを持たなくなっていて、DASDボリュームを無駄なく効率よく使うことがより重要視されています。従って、データセットにおける最適なブロックサイズというのは、3390型DASDのトラックに2つ書ける長さのブロック長である27,998バイトに、限りなく近づけられた長さです。固定長であれば「27998÷レコード長×レコード長」ですし、可変長であれば27998バイト(RECFM=VB,BLKSIZE=27998,LRECL=27994)です。

SDB登場前は、データセットを作成する際にアクセス効率やスペース効率のよいブロック長はデータセット作成者が決めていました。何となく決めたり(例えばLRECL=80なら8000とか)、昔から使われてきたブロックサイズを踏襲したり(LRECL=80なら3120、RECFM=Uなら6447とか)ということも少なくありませんでした。
なお、昔から踏襲された3120や6447という値は何となく決まったものではなく意味があります。昔に使われた3330型DASDは、トラック長が13,030バイトでした(現在の3390は56,664バイト)。そのトラック長に最適な長さは、LRECL=80なら3120バイトでした。3330型DASDでは、1トラックに4つのブロックを入れるとすれば1ブロックの最大長は3156バイトとなるので、そのサイズに収まるブロックサイズは3120バイト(80byte×39records)だったからです。今の感覚で考えれば、「だったら13030に最も近い12960にすれば、より格納効率上がるではないの?」となりますが、3330が登場した頃は、仮想記憶をサポートするSystem/370もまだ出始めで、実記憶だけで処理していたSystem/360も現役で使われていた時代です。ブロックサイズ12K?そんなにメモリー使えないよ!ということで、アクセス効率とスペース効率の兼ね合いで3120バイトというブロックサイズが最適とされていました。ロードモジュール・ライブラリーに使われた6447というブロックサイズも同様の考え方で設定されたものです。その後、3350、3380、3390とディスク装置は新しくなりトラック長も長くなっていきますが、新しく作るものならともかく、既存のデータセットのブロックサイズをいちいち変えるようなこともしないことが殆どなので、今日でも踏襲されることはあるのです。
 関連記事「ブロックサイズ(BLKSIZE)」