VSAM搜索VS COBOL搜索/循环

Sag*_*fus 0 performance cobol jcl vsam

我有一个文件,可能包含约300万条记录.在整个程序运行过程中,需要多次更新此文件的某些记录.如果我需要从此文件中提取特定记录,则以下哪项更有效:

  1. 索引VSAM搜索
  2. 使用COBOL搜索所有索引的平面文件
  3. 将所有数据缓冲到工作存储中并编写循环来处理搜索

Mik*_*son 5

显然,如果你可以将所有数据缓冲到内存中(如果主机系统可以支持一个工作集页面,这个页面足够大,可以让所有数据实际保留在RAM中而不需要分页,那么这可能是最快的可能的方法.

但是,要非常小心地考虑由虚拟内存分页子系统引起的"隐藏磁盘I/O"!如果请求的"内存中"数据实际上不是 "在内存中",则会发生页面错误,并且您的进程将在其检索页面之前停止.(如果发生"页面窃取",那么,你就遇到了麻烦.你的"内存中"策略刚刚变成了一个非常低效的(!)基于磁盘的策略.如果密钥是随机分配的,那么你的进程就有了一个巨大的工作集,它正在随机访问. 如果所有的内存实际上都不在内存中,并且会留在那里,那你就麻烦了.

如果要对大文件进行更新,请考虑在处理update-delta文件之前对其进行排序,以便所有出现的相同键都相邻.您现在可以编写COBOL程序来利用这一点(当然,abend如果检测到无序记录,也可以这样做!). 如果"this"记录中的键与"previous"记录中的键相同,则无需重新读取记录.(而且,在密钥确实发生变化之前,您实际上不需要编写旧记录.)由于索引文件访问方法带有一系列密钥,因此每个密钥可能"接近"先前的密钥 -请求,以便一些必要的索引树页面已经在内存中.显然,您需要对此进行基准测试,但是对文件进行排序所花费的时间远远少于在索引查找中花费的时间.(实际上可能相当大.)