VSAM搜索VS COBOL搜索/循环

时间:2016-06-24 16:59:18

标签: performance cobol jcl vsam

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

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

2 个答案:

答案 0 :(得分:5)

显然,如果你可以将所有数据缓冲到内存(和,如果主机系统可以支持一个足够大的页面工作集,它的实际上在没有分页的情况下保留在RAM中,那么这可能是最快的方法。

但是,要非常小心地考虑"隐藏磁盘 - I / O"由虚拟内存分页子系统引起的!如果要求"在内存中#34;事实上,数据"在内存中,"页面错误将发生,您的过程将停止在其轨道中,直到检索到页面。 (如果"页面窃取"发生,那么,你就麻烦了。你的内存和#34;策略刚刚变成一个可能非常低效的(!)基于磁盘的如果密钥是随机分布的,那么你的进程就有一个巨大的工作集,它正在随机访问如果那个内存的全部实际上不是 在记忆中,并将留在那里,你有麻烦。

如果要对大文件进行更新,请在处理之前考虑排序更新-delta文件,以便所有出现的相同密钥都相邻。您现在可以编写COBOL程序以利用此(当然,如果检测到无序记录,则可以abend。)。如果键入& #34;这"记录与"之前"的关键字相同一,然后你不需要重新阅读记录。 (并且,实际上您不需要旧记录,直到密钥确实发生变化。)由于索引文件访问方法随着一系列密钥一起呈现,因此每个密钥可能都是& #34;接近"先前请求的那个,这样一些必要的索引树页面已经在内存中。显然,您需要对此进行基准测试,但是对文件进行排序所花费的时间远远少于在索引查找中花费的时间。 (实际上可能相当可观。)

答案 1 :(得分:4)

迈克的答案有一个重要的问题:"隐藏的I / O" in(取决于机器,配置,数据量)......

如果你很可能需要更新许多记录,Mike建议的选项是最有用的。

如果你很可能需要更新不多的记录(我猜你可能会低于2%),另一种方法可能会更快(需要基准测试!):

  • 通过索引VSAM搜索读取每个密钥
  • 将更改的记录存储在内存中(大发生表),如果您只更改某些值并且记录非常大,那么只存储表中所有可能更改的值+键而没有实际的REWRITE
  • 在进行VSAM搜索之前:如果您读取了密钥,请查看您的发生表 已经,从那里取值或得到一个新的
  • ...
  • 在程序结束时:完成您的搜索和REQRITE所有记录(如果您有完整记录REWRITE就足够了,否则您首先需要READ得到完整的记录)

绩效通常是:"了解您的数据和可能的计划流程,然后尝试最好的2-3方法,基准并决定"。