VSAM文件
VSAM是虚拟存储存取方法(Virtual Storage Access Method)的英文缩写。它是一种采用虚拟存储存取方法的文件。对用户来说,文件只有控制区间和控制区域等逻辑存储单位,与外存储器中柱面、磁道等具体存储单位没有必然的联系。用户在存取文件记录时,不需要考虑该记录的当前位置是在内存还是在外存,也不需要考虑何时执行对外存进行读/写的命令,更方便用户的使用。
和ISAM文件一样,VSAM文件也是索引顺序文件组织方式,但ISAM文件是采用静态索引结构,而VSAM是采用B+树的动态索引结构。关于B+树的概念我们在第六章已经讲解过,这里就不再赘述。
1、VSAM文件的组成
VSAM文件的结构由三部分组成:数据集、顺序集和索引集。现有一个VSAM文件结构图,如图1所示。
图1 VSAM文件结构示意图
(1)数据集:文件的记录均存放在数据集中,数据集中的一个结点称为控制区间(Contorl Interal),它是一个I/O操作的基本单位,由一组连续的存储单元组成。控制区间的大小可随文件不同而不同,但同一文件上控制区间的大小相同。每个控制区间含有一个或多个按关键字递增有序排列的记录。
(2)顺序集和索引集
顺序集和索引集一起构成一棵B+树,作为文件的索引部分。
顺序集用于存放控制区间的索引项,一个索引包含该控制区间的最大关键字和指向区间的指针。若干个控制区间的索引项组成顺序集中的一个节点,节点之间用指针链接,使整个顺序集形成一个链表。顺序集中一个节点和与之对应的控制区间组成一个控制区域。
每个顺序集的节点又在其上一层的节点中建立索引,且逐层向上建立索引,每个索引项都是由下层若干个节点的最大关键字和指向这些节点的指针组成。这些上层的索引组成了索引集,它们是B+树的非终端节点。
2、VSAM文件的插入和删除
和ISAM文件不同,VSAM文件没有溢出区,解决插入的方法是在初建文件时留出空间:一是每个控制区间内并未填满记录,而是在最末一个记录和控制信息之间留有空隙;二是在每个区域中有一些完全空的控制区间,并在顺序集的索引中指明这些区间。
在VSAM文件中插入新记录时有四种情况:
(1)新记录能直接插入到相应的控制区间中,但需要修改顺序集中的索引项;
(2)新记录插入的控制区间未填满,但需要把其中较大的关键字向后移;
(3)新记录要插入的空间已满,此时要进行控制区域的分裂,即将接近一半的记录移到同一控制区间中,并修改顺序集中相应的索引;
(4)新记录要插入的控制区域中已没有完全空的控制敬意,要进行控制区域的分裂,此时顺序集中的节点也要分裂;
在VSAM文件中删除记录时,将同一控制区间中,比删除记录关键字大的记录向前移动,把空间留给以后要插入的新记录;若整个控制区间变空,则回收作空闲区间用,且删除顺序集中相应的索引项。
和ISAM文件相比,基于B+树的VSAM文件的查找效率更高;动态分配和释放存储空间,可以保持较高的存储空间利用率;而且不必对文件进行重组。因此,VSAM文件通常被作为大型索引顺序文件的标准组织。