Performance VSAM搜索与COBOL搜索/循环

Performance VSAM搜索与COBOL搜索/循环,performance,cobol,jcl,vsam,Performance,Cobol,Jcl,Vsam,我有一个文件可能包含大约300万条记录。在整个程序运行过程中,此文件的某些记录需要多次更新。如果需要从此文件中提取特定记录,以下哪项更有效: 索引VSAM搜索 带COBOL搜索全部的索引平面文件 将所有数据缓冲到工作存储器中,并编写一个循环来处理搜索 显然,如果您可以将所有数据缓冲到内存中,并且如果主机系统能够支持一组足够大的页面,以允许所有页面在不分页的情况下实际保留在RAM中,那么这可能是最快的方法 但是,要非常小心地考虑虚拟内存分页子系统造成的隐藏磁盘I/O!如果请求的内存数据实际上不在内

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

索引VSAM搜索 带COBOL搜索全部的索引平面文件 将所有数据缓冲到工作存储器中,并编写一个循环来处理搜索 显然,如果您可以将所有数据缓冲到内存中,并且如果主机系统能够支持一组足够大的页面,以允许所有页面在不分页的情况下实际保留在RAM中,那么这可能是最快的方法

<>但是,要非常小心地考虑虚拟内存分页子系统造成的隐藏磁盘I/O!如果请求的内存数据实际上不在内存中,则会发生页面错误,进程将停止运行,直到检索到页面为止。如果网页被窃取,你就有麻烦了。您的内存策略可能变得非常低效!基于磁盘的。如果密钥是随机分布的,那么您的进程有一个巨大的工作集,它是随机访问的。如果所有的记忆实际上都不在记忆中,并且会留在那里,那么你就有麻烦了


如果你正在对一个大文件进行更新,请考虑在处理它之前排序更新delta文件,以便所有相同密钥的出现将是相邻的。现在,您可以编写COBOL程序来利用这一点,当然,如果检测到无序记录,还可以执行异常终止操作!。如果此记录中的键与上一条记录中的键相同,则无需重新读取该记录。而且,您实际上不需要写入旧记录,直到密钥发生更改。由于索引文件访问方法提供了一系列键,因此每个键很可能接近先前请求的键,因此一些必要的索引树页面将已经在内存中。显然,您需要对其进行基准测试,但是对文件进行排序所花费的时间可能远远少于索引查找所花费的时间。这实际上是相当可观的。

Mike的答案有一个重要的问题,即隐藏的I/O取决于机器、配置、数据量

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

如果您很可能不需要更新太多记录,我猜您可能低于2%,另一种方法可以更快,需要一个基准

通过索引VSAM搜索读取每个密钥 将更改后的记录存储在内存大表中,如果您只更改一些值,并且记录非常大,则只在表中存储所有可能更改的值+键,而不进行实际重写 在执行VSAM搜索之前:如果读取密钥,请查看occurs表 现在,从那里获取值或获取新值 ... 在程序结束时:检查您的事件并重新写入所有记录如果您有完整的记录,重写就足够了,否则您需要先读取才能获得完整的记录
性能通常是:了解您的数据和可能的程序流程,然后尝试最好的2-3方法,进行基准测试并做出决定。

在这两个答案中,您已经有了一些很好的建议。然而,你的问题的任何具体答案都不清楚,因为没有足够的细节。要从同一批处理程序多次更新同一KSDS记录是不常见的。您缺少两个文件匹配,其中两组数据的键顺序相同,并在步骤中读取它们。即使没有更新,KSD的点击率也很低,这可能是一条可行之路。但是知道你的数据是必不可少的。糟糕的代码/糟糕的想法是常见的性能问题。仅供参考,在OP使用的z/OS操作系统上,有一个允许页面修复的系统服务。显然,这只能在逻辑上或物理上按关键顺序明智地使用。这是一个来自COBOL程序的简单调用。这就是理论。实践是在不让技术人员知道的情况下不要这样做。但这是可能的。