对不起,我英语不好
我必须优化以这种方式编写的脚本
1)检索数据的proc sql
proc sql;
Create table table2 as
Select A.Id
,A.UsefulData1
,B.UsefulData2
,...
,B.UsefulDataN
FROM Table1 as A
LEFT JOIN TableParam1 AS B
ON A.KeyA = B.KeyA
AND A.KeyB = B.KeyB
/* here : several left join */
LEFT JOIN TableParam2 AS N
ON A.KeyA = N.KeyA
AND A.KeyB = N.KeyB
;
quit;
2)然后执行数据步骤,以计算大量数据
data table3;
set table2;
/* here : lot of complex computes depending on useful data of the previous step */
keep id, computedData1, ..., computedDataN
run;
/* then add index on the id for later join */
/* if not debug, delete the proc sql table */
然后,它重复“ proc sql / data step”的相同逻辑,其中新的proc sql使用上一个数据步骤的计算数据。 最后,我有几个“ proc SQL表/数据步骤表”。
它非常清楚和易于理解,但是我发现它效率不高,因为proc sql生成的表只是一个“临时表”,仅对数据步骤有用。因此,我编写了一个临时表,由于它们是大表(> 1000万行),因此在时间上会浪费很多时间
在我看来,最有效的方法是将“ proc sql table”保留在内存中,然后仅输出“ data step table”。我会节省大量的写作时间。
有没有办法做这样的事情?还是您看到另一种最有效的方法?
感谢您的帮助!
答案 0 :(得分:0)
是的,首先想到的与汤姆(Tom)相同-将第一行PROC SQL行更改为create view table2 as
,然后至少不要使用中间表的存储。
但是,如果SQL仅合并数据集,则完全没有必要,因为您可以在数据步骤中做到这一点。将set table2
替换为merge
语句,然后在此处合并所有数据集。
答案 1 :(得分:0)
“复杂计算”的本质是什么?如果它们仅是按行计算,则可以在SQL中对其进行编码。
可以使用数据集选项(在创建表表名或数据表名中)构建索引
proc sql;
create table want (index=(id/unique)) as
select …
, … as complicated_result1
…
, … as complicated_resultN
from T1
left join T2 on …
left join T3 on …
...
或
data want (index=(id/unique));
merge T1 T2 T3 …;
by key1 key2 … keyN;
complicated_result1 = …
…
complicated_resultN = …
…