VSAMとは
VSAM(Virtual Storage Access Method)とは、データをレコード単位に格納しプログラムで処理するためのデータセットへのアクセス方式です。OSの仮想記憶の機能や仕組みを前提として実装されたファイルシステムであることから仮想記憶アクセス方式と呼ばれます。当初からあったSAM(順次アクセス方式)やDAM(直接アクセス方式)などと異なり、データセットの物理構造をプログラムが意識しなくてもいいように設計されました。
VSAMでアクセスされるレコードを格納した器がVSAMデータセットです。VSAMデータセットは、他のデータセットと異なりディスク装置にしか置くことができません。テープ・メディアにVSAMデータセットを作成するようなことはできないのです。バックアップをテープに置くことはできますが、この場合のバックアップ・データセットはVSAMではなく、VSAMデータセット内のレコードをアンロードして並べた順次データセットになります
VSAMではQSAMやBPAMなどの順次データセットや区分データセットと異なり、プログラムはディスク内のVSAMデータセットに直接アクセスするわけではありません。VSAMによって仮想記憶上に展開されたファイル・レコードにアクセスすることになります。なお、メモリー上に展開されるというのは、従来のSAMやDAMといったアクセス方式のようにデータセットの物理的なブロック構造がそのままプログラムに入ってくるのではなく、物理的なブロック構造内のレコード・データがVSAMによって仮想記憶上に展開されるということです。仮想記憶システムが登場してより多くのメモリーを使うことができるようになり、データセットの物理構造とプログラムが扱うレコードの論理構造を切り離すことが可能になりました。
補足:VSAMでもデータの実体はディスク上のデータセットですが、このデータセットにはVSAMによる内部フォーマットによってデータが整理されて格納されています。プログラムはVSAMデータセット内の物理データレコードをそのまま扱うのではなく、VSAMがプログラムで扱う論理レコードの形式に再構成して仮想記憶上に展開したデータがプログラムに渡されます。プログラムは定められたAPI(GETとかPUTなど)を出せばよく、VSAM内部の動きなど意識する必要はありません。似たようなものとしてPDSEがあります。PDSEもディスク上の実体は4KB固定長レコードの順次データセットですが、プログラムからは区分編成データセットとしてアクセスできます。
VSAMもPDSEも順次編成データセットや区分編成データセットのように、データセットの物理的なブロック構造がそのままプログラムに入ってくるわけではありません。仮想記憶上に展開されたメモリー上の仮想のファイルにアクセスするようなものです。しかし、それはデータセットがまるごとメモリーに読み込まれてディスクへのI/Oが行われないと言う意味での仮想記憶上に展開ではありません。
VSAMの特長
VSAMもQSAM同様に論理レコード単位にデータをやり取りすることができます。しかし、順次アクセス以外にも直接アクセスやキーによるレコードの検索などもでき、順次アクセスであっても後ろへ戻ったり前へ飛ばしたりなど任意のレコードを直接示すこともできるようになっています。メモリー・イメージをそのまま格納するような目的のために、リニア形式というレコード構造を持たない先頭から最後までが1つに繋がったフラットなスペースで構成するものもあります。
VSAMは、その仕組みや機能からアプリケーションプログラムのデータの格納用に幅広く使われてきました。キーによる検索やレコードのランダムアクセスなどは、VSAM以前にもISAMやBDAMといったアクセス方式で提供されていましたが、VSAMによってより簡単にデータファイルを構築できるようになり、1970年代から80年代にかけては業務データの格納ファイルの主力として使われました。その後データベース・システムが出現し、現在では業務データの格納にはDB2、IMS/DBなどのデータベース・システムが主に利用されています。しかし、VSAMはこれらデータベース・システムの原型とも言えるもので、実際のデータベースの実装にもVSAMが利用されたりもしました。今ではRDBMSが主流ですが、シンプルな構造でもよいものならばVSAMを直接使う方が簡単で軽かったりします。
VSAMデータセットの種類
VSAMにはアクセス方法に応じて4種類のデータセットがあります。KSDS、ESDS、RRDSいずれも固定長または可変長の論理レコードを作れます。
- KSDS: キーに対応したレコードを検索しアクセスできる。
- ESDS: 順次データセットのようにアクセスできる。
- RRDS: ランダムアクセスができる。
- LDS : 先頭から最後まで1つに繋がったイメージ。メモリーをマッピングしたようなもの。
各VSAMデータセットの詳細は、z/OSのしくみ:基礎編:データセットの種類とアクセス方式の記事の「VSAMデータセット」を参照して下さい。
VSAMデータセットの処理
VSAMデータセットの作成や保守用には、AMSと呼ばれるアクセス方式サービスプログラムというユーティリティーが利用されています。AMSは、作成したVSAMデータセットに順次データセット内のレコードをローディングしたり、データが格納されているVSAMデータセットをバックアップしたりするのにも使われます。現在のz/OSでは、JCLのDDステートメントにもVSAM用のパラメーターが追加されているのでIEFBR14でもVSAMがアロケーションできたり、GENERでPSとVSAM間でコピーできたりしますが、VSAMとAMSユーティリティーは切っても切れない関係にあります。VSAMを扱うならAMSユーティリティーの基本的な機能や使い方はしっかり覚えることが大切です。AMSユーティリティーについては、「IDCAMS」の記事を参照して下さい。
また、VSAMには次のI/O機能が提供されています(抜粋)。
- OPEN
- CLOSE
- GET
- PUT
- ERASE
- POINT
データセットをオープンする。OSはメモリー内にアクセス用のバッファーを用意し、指定されたデータセットをアクセスするためのコントロールブロックとアクセス環境を作り上げる。
データセットをクローズする。
次のもしくは指定した論理レコードを取り出す。
次のもしくは指定した論理レコードを書き出す。
取り出した論理レコードを削除する。
次にアクセスするレコード位置を変更する。
機能の名前はQSAMやBSAMなどと大差はありません。これらはアセンブラーマクロで直接VSAMのアクセスメソッドを呼び出す場合に使用します。COBOLなどでは言語のI/Oステートメントの記述によってアクセスできます。
サンプルコード
このサンプルは、次のような構造のレコードを持つKSDSデータセットから顧客番号をキーにしてレコードを検索し読み出すCOBOLプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
***************************************************************** * COBOL EXAMPLE PROGRAM(SEARCH VSAM KSDS DATASET) ***************************************************************** IDENTIFICATION DIVISION. PROGRAM-ID. CUSTOMER. ENVIRONMENT DIVISION. CONFIGURATION SECTION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT MSTRFILE ASSIGN TO SYSMSTR ORGANIZATION IS INDEXED RECORD KEY IS PHONE ACCESS IS DYNAMIC FILE STATUS IS FS-CODE. * DATA DIVISION. FILE SECTION. FD MSTRFILE RECORD 80. 01 MSTRDATA. 03 PHONE PIC X(10). 03 NAME PIC X(20). 03 ADDR PIC X(50). WORKING-STORAGE SECTION. 01 FS-CODE PIC XX. * PROCEDURE DIVISION. OPEN INPUT MSTRFILE. DISPLAY "INPUT CUSTOMER PHONE NUMBER." UPON SYSOUT. LOOP. MOVE SPACE TO PHONE. ACCEPT PHONE FROM SYSIN. IF PHONE = SPACE THEN CLOSE MSTRFILE STOP RUN. READ MSTRFILE. IF FS-CODE = "00" THEN DISPLAY "NAME=", NAME, "INFO=", ADDR UPON SYSOUT ELSE DISPLAY "RECORD NOT FOUND." UPON SYSOUT. GO TO LOOP. |
レコードの先頭10バイトが検索キーです。COBOLなどでは言語仕様がアクセス方式を隠してしまうので、プログラミングではVSAMをアクセスしているという意識があまりありません。実際にVSAMを意識するのはデータセットを作成したりデータをローディングする作業においてでしょう。