Sas 在多个表中查找主键

Sas 在多个表中查找主键,sas,Sas,我正在解决的问题有很多简单的解决方案,但我需要的是找到方法来减少这个过程所需的时间和内存 一边是一张有几百个ID的桌子,另一边是40张月表和计数表。 每个表都有50万到100万条记录,每个记录都有唯一的id。每个表有几千个变量,但我只需要10-20个 当基表中出现特定id时,我需要查找表以查找最新的表,并获取所需的变量值。 最新的月份表每天都在计算,所以前几个月的id可能会再次出现,所以我不能只创建一次索引字典(last.id和变量)。此外,我也负担不起每天根据所有表格创建新词典的费用 我提出

我正在解决的问题有很多简单的解决方案,但我需要的是找到方法来减少这个过程所需的时间和内存

一边是一张有几百个ID的桌子,另一边是40张月表和计数表。 每个表都有50万到100万条记录,每个记录都有唯一的id。每个表有几千个变量,但我只需要10-20个

当基表中出现特定id时,我需要查找表以查找最新的表,并获取所需的变量值。 最新的月份表每天都在计算,所以前几个月的id可能会再次出现,所以我不能只创建一次索引字典(last.id和变量)。此外,我也负担不起每天根据所有表格创建新词典的费用

我提出了一些想法,但我需要您的帮助来找到最有效的概念:

  • 将所有月表与所需的变量连接起来,按升序ID和月份排序,使用数据步骤选择last.ID。对基表使用联接或合并。 问题:设置所有表需要太多内存。 或者,我在循环中使用proc append。不幸的是,时间和内存效率都不高

  • 在循环中分别与所有表进行内部联接: 内存使用率低,但非常耗时

  • 根据除最新月份外的所有月份创建字典,并每天更新。 问题:大字典表

  • 现在,我正在寻找解决这类问题的聪明概念。也许散列对象。。但是怎么做呢

    如果你能就这个案子给我一些反馈,我将不胜感激


    谢谢大家!

    如果有人编写一些代码,根据您的规格生成一些虚拟数据,他们可能能够为您的问题提供更具体的答案。但如果没有样本数据,就很难知道没有反复试验的最佳方法

    相反,我将我的一些旧答案改写成一个更全面的清单,你可以检查

    以下是一些提高性能的方法(大致按照性能改进的顺序,YMMV):

  • 索引每个表中的字段,这些字段将加入where子句或在where子句中使用。并非所有字段都是索引的好候选字段,所以请在索引之前研究一下如何确定这些字段

  • 尽可能早地减少进程中的行数(即,使用where子句删除您不关心的任何内容)

  • > p>如果连接仍然是费时的,考虑用哈希表查找替换它们。

  • 压缩。在构建数据集时,如果尚未使用compress=yes选项,请确保使用该选项。这将缩小磁盘上表的大小,从而减少磁盘I/O(查询最慢的部分)

  • >P>如果步骤为IO密集型,考虑使用视图而不是创建临时表。

  • 确保您正在使用proc append将数据集附加在一起以减少IO(听起来像是这样,只是为了完整性而添加这个)。将较小的数据集附加到较大的数据集。或者,使用视图“附加”它们,而无需重复开销

  • 使用keep语句(减少IO)限制正在处理的列

  • 检查列长度-确保您没有使用$255的字段长度来存储只需要$20长度的内容,等等

  • 使用SAS SPDE(可扩展性能数据引擎)。它允许您将SAS数据集划分为多个文件,并可以选择将它们分布在不同的磁盘上。一旦SAS数据集达到一定大小,您就可以看到性能改进。我通常倾向于在数据集增长>10G时使用SPD libnames。不需要额外的SAS模块-这是作为基本SAS的一部分启用的