为什么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;
Run Code Online (Sandbox Code Playgroud)
日志的摘录:
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
Run Code Online (Sandbox Code Playgroud)
SASHELP使用的内存略高,但差别不大.注意时间 - 使用SASHELP比使用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
Run Code Online (Sandbox Code Playgroud)
其中一些(如果不是全部)是 SQL 和 Data Step 之间的开销差异。例如:
proc sql;
create table test2 as
select *
from sashelp.vcolumn
where libname = 'SASHELP' and
memname = 'CLASS' and
memtype = 'DATA';
quit;
Run Code Online (Sandbox Code Playgroud)
也非常快。
关于字典表的SAS页面提供了一些可能是主要解释的信息。
查询 DICTIONARY 表时,SAS 启动一个发现过程,收集与该表相关的信息。根据正在查询的 DICTIONARY 表,此发现过程可以搜索库、打开表和执行视图。与其他 SAS 过程和 DATA 步骤不同,PROC SQL 可以通过在启动发现过程之前优化查询来缓解此过程。因此,尽管可以通过 SAS 过程或使用 SASHELP 视图的 DATA 步骤来访问 DICTIONARY 表信息,但使用 PROC SQL 通常更有效。