我尝试了以下选项,但响应时间不可接受 - 创建索引“键”也无济于事(注意:两个数据集中的重复“键”):
data a;
merge b
c;
by key
if b;
run;
=== 或 ===
proc sql;
create a
as select *
from b
left outer join c
on b.key;
quit;
我尝试了以下选项,但响应时间不可接受 - 创建索引“键”也无济于事(注意:两个数据集中的重复“键”):
data a;
merge b
c;
by key
if b;
run;
=== 或 ===
proc sql;
create a
as select *
from b
left outer join c
on b.key;
quit;
在合并它们之前,您应该首先对这两个数据集进行排序。这就是将要表现的东西。当您必须扫描整个表以获得结果时使用索引通常比预排序数据集并合并它们要慢。
一定要尽可能地修剪你的数据集。在数据步骤或 proc sql 之前对数据集进行排序。另外,如果重要的话,我不是 100%,但 ANSI SQL 会是proc sql; create a as select * from b left outer join c on b.key=C.KEY; quit;
您可以尝试 SQL 合并。我不知道它是否会更快满足您的需求,但我发现 SQL 比常规 SAS 合并更有效。此外,一旦您意识到可以使用 SQL 做什么,操作数据集就会变得更容易!
创建密钥是让数据集准备好加入的最快方法。对它们进行排序可能需要与合并它们一样长的时间,如果不是更长的话,但仍然是一个好主意。
AFHood 的修剪建议很好。您可以通过 PROC Summary 运行它们吗?有没有可以删除的列?这些中的任何一个都将减少数据集的大小并加快合并速度。
然而,这些方法都不可能奏效。我经常合并几百万行的文件,这可能需要一段时间。
不要使用数据步骤合并来执行此操作。
如果两个数据集中有重复的键,结果将是错误的。
唯一的方法是使用
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,则需要从其中一个数据集中删除重复的键。