proc sql noprint;
create talble a as
select * from Table1
where ID in (select ID from Table2);
quit;
这样做的话,时间耗费大致如下:
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
实际时间 1:39.79
CPU 时间 23.72 秒
但如果我把Table2的ID取出来,做成宏变量&ID_String,并加引号且用逗号分隔,再把上面的代码写成如下的形式:
proc sql noprint;
create talble a as
select * from Table1
where ID in (&ID_String);
quit;
所花时间则会大大减少:
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
实际时间 2.98 秒
CPU 时间 0.26 秒
前一种情况只是多做了一次select,而且单独做这次select也花不了一秒钟的时间,为什么把它放在where里就会使整个Sql步多花几十倍的时间?
这里只能给这样的结果了,因为数据量大不好发上来,如果要试一下的话,也可以用下面的代码,里面用到了SASHELP库里的数据集,结果是类似的,只是数量级小很多:
- proc sql noprint;
- select distinct STATE into :aa_STATE separated by ' '
- from SASHELP.Zipcode
- order by STATE;
- quit;
- %let aa_STATE=%SYSFUNC(TRANSLATE(&aa_STATE,%STR(,),%STR( )));
- proc sql noprint;
- create table want as
- select * from SASHELP.Class
- where Age in (select STATE from SASHELP.Zipcode);
- quit;
- proc sql noprint;
- create table want as
- select * from SASHELP.Class
- where Age in (&aa_STATE);
- quit;
有没有人遇到过这样的情况,有没有什么好的办法来解决,谢谢大家!



雷达卡




京公网安备 11010802022788号







