在SAS 8.2中合并/连接2个大型数据集的有效方法

时间:2009-02-11 09:10:42

标签: sas

我尝试了以下不可接受的响应时间选项 - 创建索引'key'也没有帮助(注意:在两个数据集中都有duplicate'keys'):

data a;
merge b
      c;
by key
if b;
run;

=== OR ===

proc sql;
create a
as select * 
from b
left outer join c
on b.key;
quit;

5 个答案:

答案 0 :(得分:1)

在合并之前,您应首先对两个数据集进行排序。这就是性能。当你必须扫描整个表以获得结果时使用索引通常比预先分配数据集并合并它们更慢。

答案 1 :(得分:1)

请务必尽可能地修剪数据集。在数据步骤或proc sql之前对数据集进行排序。另外,如果重要的话,我不是100%,但ANSI SQL将是proc sql; create a as select * from b left outer join c on b.key=C.KEY; quit;

答案 2 :(得分:0)

创建密钥是使数据集准备好加入的最快方法。对它们进行排序可能只需要合并它们,如果不是更长,但仍然是一个好主意。

AFHood建议修剪它们是一件好事。您可以通过PROC摘要运行它们吗?你可以删除任何列吗?其中任何一个都会减小数据集的大小并使合并更快。

然而,这些方法都不起作用。我经常合并几百万行的文件,这可能需要一段时间。

答案 3 :(得分:0)

您可以尝试SQL合并。我不知道它是否会更快满足您的需求,但我发现SQL比常规SAS合并更有效。此外,一旦您意识到使用SQL可以做什么,操作数据集就变得更容易了!

答案 4 :(得分:0)

请勿使用数据步骤合并来执行此操作 如果两个数据集中都存在重复键,则结果将是错误的 唯一的方法是使用

Proc SQL;   
  Create table newdata    
  as select firsttable.aster, secondtable.aster    
  from table1 as firsttable   
  inner join table2 as secondtable    
  on (firstable.keyfield = secondtable.keyfield);   
quit;

如果您有多个关键字段,则连接顺序应该是最后匹配字段,最后匹配最大匹配字段。 SAS对于创建一个包含所有可能的匹配的临时数据集以及从那里剔除它有着不好的习惯。可以吹灭你的临时空间分配并减慢每一次的速度。

如果您仍然希望使用DATA Step,那么您需要从其中一个数据集中删除重复的键。