查找多个表

时间:2016-04-04 19:28:50

标签: sas

我解决的问题有许多简单的解决方案,但我需要的是找到减少流程所需时间和内存的方法。

一方面,我有一张桌子,上面有几百个ID,另外一张桌子上还有40张月份桌子。 每个表具有500,000到1毫升记录,每个记录用于唯一ID。每个表都有很少的变量,但我只需要10-20个变量。

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

Visual description

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

  1. 使用所需变量连接所有月度表,按升序ID和月份排序,使用数据步骤选择last.id。使用连接或与基表合并。 问题:设置所有表需要太多内存。 或者我使用proc追加循环。不幸的是,时间和记忆效率不高。

  2. 在循环中分别与所有表进行内连接: 内存使用率低但非常耗时。

  3. 根据最新的月份创建字典,并每天更新。 问题:大字典表。

  4. 现在我正在寻找如何解决这类问题的智能概念。也许哈希对象..但是怎么样?

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

    谢谢!

1 个答案:

答案 0 :(得分:0)

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

相反,我已将我的一些旧答案解释为更全面的一系列您可以查看的内容。

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

  1. 索引要加入或使用where子句的每个表中的字段。并非所有字段都是索引的良好候选者,因此请在索引之前对如何确定这一点进行一些研究。

  2. 尽可能早地减少行数(即使用where子句去除你不关心的任何事情)。

  3. 如果连接仍然很耗时,请考虑使用哈希表查找替换它们。

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

  5. 如果步骤是IO密集型的,请考虑使用视图而不是创建临时表。

  6. 确保使用proc append将数据集附加在一起以减少IO(听起来像你一样,只是为了完整性而添加它)。将较小的数据集附加到较大的数据集。或者使用视图来追加'它们没有重复开销。

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

  8. 检查列长 - 确保您不使用$ 255的字段长度来存储只需要20美元等的内容...

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