为什么SAS使用数据步骤视图创建数据集需要更长的时间,例如sashelp.vcolumn
与等效的SQL表dictionary.columns
?
我使用fullstimer
进行了测试,似乎证实了我对性能差异的怀疑。
option fullstimer;
data test1;
set sashelp.vcolumn;
where libname = 'SASHELP' and
memname = 'CLASS' and
memtype = 'DATA';
run;
proc sql;
create table test2 as
select *
from dictionary.columns
where libname = 'SASHELP' and
memname = 'CLASS' and
memtype = 'DATA';
quit;
日志摘录:
NOTE: There were 5 observations read from the data set SASHELP.VCOLUMN.
WHERE (libname='SASHELP') and (memname='CLASS') and (memtype='DATA');
NOTE: The data set WORK.TEST1 has 5 observations and 18 variables.
NOTE: DATA statement used (Total process time):
real time 0.67 seconds
user cpu time 0.23 seconds
system cpu time 0.23 seconds
memory 3820.75k
OS Memory 24300.00k
Timestamp 04/13/2015 09:42:21 AM
Step Count 5 Switch Count 0
NOTE: Table WORK.TEST2 created, with 5 rows and 18 columns.
NOTE: PROCEDURE SQL used (Total process time):
real time 0.03 seconds
user cpu time 0.01 seconds
system cpu time 0.00 seconds
memory 3267.46k
OS Memory 24300.00k
Timestamp 04/13/2015 09:42:21 AM
Step Count 6 Switch Count 0
SASHELP使用的内存略高,但差别不大。请注意时间 - 使用SASHELP的时间 22次比使用SQL词典时长 22次。当然,它不能归因于内存使用量的相对较小的差异。
在@Salva的建议中,我在新的SAS会话中重新提交了代码,这次在数据步骤之前运行SQL步骤。记忆和时间差异更加明显:
| sql | sashelp
----------------+-----------+-----------
real time | 0.28 sec | 1.84 sec
user cpu time | 0.00 sec | 0.25 sec
system cpu time | 0.00 sec | 0.24 sec
memory | 3164.78k | 4139.53k
OS Memory | 10456.00k | 13292.00k
Step Count | 1 | 2
Switch Count | 0 | 0
答案 0 :(得分:3)
一些(如果不是全部)这是SQL和Data Step之间的开销差异。例如:
proc sql;
create table test2 as
select *
from sashelp.vcolumn
where libname = 'SASHELP' and
memname = 'CLASS' and
memtype = 'DATA';
quit;
也很快。
SAS page about Dictionary Tables提供了一些可能是主要解释的信息。
在查询DICTIONARY表时,SAS启动发现过程 收集与该表相关的信息。取决于 正在查询的DICTIONARY表,此发现过程可以 搜索库,打开表和执行视图。与其他SAS不同 程序和DATA步骤,PROC SQL可以缓解这个过程 在启动发现过程之前优化查询。 因此,尽管可以访问DICTIONARY表 使用SAS程序的信息或使用SASHELP的DATA步骤 在视图中,使用PROC SQL通常更有效。
答案 1 :(得分:0)
根据我的经验,使用sashelp视图比使用proc数据集要慢。如果您分配了大量库,尤其是外部库,则更是如此:
10 proc datasets lib=sashelp noprint;
11 contents data=class out=work.test2;
12 quit;
NOTE: The data set WORK.TEST2 has 5 observations and 40 variables.
NOTE: PROCEDURE DATASETS used (Total process time):
real time 0.01 seconds
user cpu time 0.00 seconds
system cpu time 0.01 seconds
memory 635.12k
OS Memory 9404.00k
Timestamp 14.04.2015 kl 10.22