索引顺序文件


6.5 索引顺序文件


读书笔记整理:文件系统

索引顺序文件是顺序文件的扩展,其中各记录本身在介质上也是顺序排列的,它包含了直接处理和修改记录的能力。索引顺序文件能像顺序文件一样进行快速顺序处理,既允许按物理存放次序(记录出现的次序),也允许按逻辑顺序(由记录主关键字决定的次序)进行处理。

索引顺序文件通常用树结构来组织索引。索引结构形成后,根据在系统运行时索引结构是否变化,又分为静态索引结构和动态索引结构。第6章介绍的B-树和B+树适用于组织索引顺序文件的动态索引结构。索引顺序存取方式ISAM(Indexed Sequential Access Method)是一种专为磁盘存取设计的文件组织方式,是一种静态索引结构。

8.5.1 ISAM

ISAM采用多级索引:主索引、柱面索引、磁道索引。文件的记录在同一盘组上存放时,应先集中放在一个柱面上,然后再顺序存放在相邻的柱面上,对同一柱面,则应按盘面的次序顺序存放。例如图8-6为存放在一个磁盘组上的ISAM文件,每个柱面建立一个磁道索引。每个磁道索引项由两部分组成:基本索引项和溢出索引项,如图8-7所示,每一部分都包括关键字和指针两项,前者表示该磁道中最末一个记录的关键字(在此为最大关键字),后者指示该磁道中第一个记录的位置。柱面索引的每一个索引项也由关键字和指针两部分组成,前者表示该柱面中最末一个记录的关键字(最大关键字),后者指示该柱面上的磁道索引位置。柱面索引存放在某个柱面上,若柱面索引较大,占多个磁道时,则可建立柱面索引的索引——主索引。

 

在ISAM文件上查找记录时,先从主索引出发找到柱面索引的分布,然后从柱面索引找到记录所在柱面的磁道索引,最后从磁道索引找到记录所在磁道的第一个记录的位置,由此出发在该磁道上进行顺序查找直至找到为止;反之,若找遍该磁道而不存在此记录,则表明该文件中无此记录。例如,查找关键字为99的记录R99时的查找路径如图8-6中的粗实线所示,即先查主索引(将主索引读入内存),由于99<400,根据指针指示找到柱面索引,由于80<99<200,则按柱面索引项200的指针指示查柱面C2 的磁道索引,因为90<99<200,在柱面C2中找到关键字99所在的磁道,最终查得R99

当然在实际使用中,通常可以把主索引常驻内存,柱面索引也可以不放在文件空间的开始柱面,而放在中间位置的柱面上较合适。因为每次查找总得先查柱面索引,然后到某一柱面上查磁道索引,这样柱面间的移动距离可短一些。

从图8-6中读者可以看到,在每个柱面上还开辟有一个溢出区,并且磁道索引项中有溢出索引项,这是为插入记录所设置的。由于ISAM文件中记录是按关键字顺序存放的,则在插入记录时需移动记录并将同一磁道上最末一个记录移至溢出区,同时修改磁道索引项。通常溢出区可有三种设置方法;(1)集中存放,即整个文件设一个大的单一的溢出区;(2)分散存放,即每个柱面设一个溢出区;(3)集中与分散相结合,即溢出时记录先移至每个柱面各自的溢出区,待满之后再使用公共溢出区。图8-6是第二种设置法。

在磁道索引中,索引项的两个子项在记录插入前是相同的,但在记录插入后可能变化。图8-8所示为插入记录和溢出处理的具体实例。其中图(a)是插入前柱面C1的状态,插入记录R65时,将磁道T2中关键字大于65的记录后移,且使R80溢出到溢出区,磁道索引也相应改变。图(b)是插入关键字为65的记录之后的状态。

在ISAM文件上删除一个记录时,只需找到待删除的记录,在其存储位置上作删除标记即可,而不需要移动记录或改变指针。但在经过多次的增删后,文件的结构可能变得很不合理。此时,大量的记录进入溢出区,而基本区中又浪费很多空间。因此,通常需要周期地整理ISAM文件。具体做法是:把记录读入内存,重新排列,复制成一个新的ISAM文件,填满基本区而空出溢出区。

8.5.2 VSAM文件

虚拟存储方法VSAM(Virtual Sequential Access Method)是B+树应用的一个典型例子,是一种索引顺序文件的组织方式。这种存取方法利用了操作系统中的虚拟存储器的功能,给用户提供方便。这种存取方法与存储设备无关,与柱面、磁道等物理存储单位没有必然联系,因为对用户而言,文件只有控制域和控制区间等逻辑存储单位。

VSAM的总体结构如图8-9所示。它由三部分组成:索引集、顺序集和数据集。文件的记录均存放在数据集中,顺序集也是文件索引的一部分,顺序集和索引集一起形成一棵B+树结构的文件索引。可以利用索引对VSAM进行随机存取,利用顺序集对文件进行顺序存取。

     数据集中的一个结点称为控制区间(Control Interval),它是一个I/O操作的基本单位,它由一组连续的存储单元组成。控制区间的大小可随文件不同而不同,但同一文件上控制区间的大小相同。每个控制区间含有一个或多个按关键字递增有序排列的记录。数据集中记录大小可以是变长的,因而每个记录都有一个控制信息,这些记录的控制信息顺次自右而左排列在控制区间的右部,中间是自由空间。另外还有一个与整个控制区间有关的控制信息,放在控制区间的最右端,用来说明控制区间中已经存放了多少记录等信息。控制区间的结构如图8-10所示。

     顺序集中存放每个控制区间的索引项。每个控制区间的索引项由两部分信息组成,即该控制区间中的最大关键字和指向控制区间的指针。若干相邻控制区间的索引项构成顺序集中的一个结点,相当于B+树的一个叶子结点,结点之间用指针连接起来,而每个结点又在其上一层的结点中建有索引,且逐层向上建立索引,所有的索引项都由最大关键字和指针两部分信息组成,这些高层的索引项形成B+树的非终端结点。因此,VSAM文件既可在顺序集中进行顺序存取,又可从最高层的索引(B+树的根结点)出发按关键字存取。顺序集中一个结点连同其对应的所有控制区间形成一个整体,称做控制域(Control Range)。每个控制区间可视为一个逻辑磁道,而每个控制域可视为一个逻辑柱面。

    VSAM文件中没有溢出区,解决插入记录的办法是在文件初建时留有一定的空闲空间。一种实现方法是在控制区间中留用一定的自由空间,如图8-10所示。另一种做法是在控制域中留有一定的空闲控制区间。为了提高效率,一个控制域中数据存放方式如图8-11所示。在图8-11中,一个控制域的数据放在同一柱面内,控制域中顺序集(索引)结点占一个磁道,控制区间存放在其它磁道上。顺序集结点可以在一个磁道上重复存放,以便减少读取索引的等待时间。

     在VSAM文件插入记录时,首先调用B+树的查找算法,确定该记录应插入的顺序集结点,进而确定该记录应插入的控制区间及相应位置。如果该控制区间中自由空间足以容纳该记录,则将要插入位置右面的记录右移腾出空间插入该记录,并在相应位置建立控制信息。例如,在图8-12的VSAM文件中插入ARS、BIT,结果如图8-13(a)所示。如果自由空间不够,则检查该控制区间所在的控制域中是否还有空闲的控制区间,若有,则将控制区间分裂,将其中的近似一半的记录移动到一个空闲的控制区间中,例如,在图8-13(a)上插入BEC,结果如图8-13(b)所示。如无,则进行一次控制域的分裂。无论是控制域的分裂还是控制区间的分裂,均需要在顺序集中插入索引项,并且这一插入有可能波及高层的索引,但这需要采用B+树的插入算法实现。

在VSAM文件中删除记录时,需将同一控制区间中较删除记录关键字大的记录向前移动,把空间留给以后插入的新记录。若整个控制区间变空,则需修改顺序集中相应的索引项。

由此可见,VSAM文件占有较多的存储空间,一般只能保持约75%的存储空间利用率。但它的优点是:动态地分配和释放存储,不需要对文件进行重组,并能较快地对插入的记录进行查找,查找一个后插入记录的时间与查找一个原有记录的时间是相同的。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值