Performance SASHELP视图与SQL字典表的性能对比
为什么SAS使用sashelp.vcolumn从数据步骤视图创建数据集比使用等效的SQL表dictionary.columns要花费更长的时间 我用Performance SASHELP视图与SQL字典表的性能对比,performance,sas,Performance,Sas,为什么SAS使用sashelp.vcolumn从数据步骤视图创建数据集比使用等效的SQL表dictionary.columns要花费更长的时间 我用fullstimer做了一个测试,它似乎证实了我对性能差异的怀疑 选项完整刺激器; 数据测试1; 设置sashelp.v列; 其中libname='SASHELP'和 memname='CLASS'和 memtype='DATA'; 跑 proc-sql; 将表test2创建为 挑选* 从dictionary.columns 其中libname='S
fullstimer
做了一个测试,它似乎证实了我对性能差异的怀疑
选项完整刺激器;
数据测试1;
设置sashelp.v列;
其中libname='SASHELP'和
memname='CLASS'和
memtype='DATA';
跑
proc-sql;
将表test2创建为
挑选*
从dictionary.columns
其中libname='SASHELP'和
memname='CLASS'和
memtype='DATA';
退出
日志摘录:
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比使用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
其中一部分(如果不是全部的话)是SQL和Data Step之间的开销差异。例如:
proc sql;
create table test2 as
select *
from sashelp.vcolumn
where libname = 'SASHELP' and
memname = 'CLASS' and
memtype = 'DATA';
quit;
也很快
SAS提供了一些可能是主要解释的信息
查询字典表时,SAS启动发现过程
它收集与该表相关的信息。取决于
对于正在查询的字典表,此发现过程可以
搜索库、打开表和执行视图。与其他SAS不同
过程和数据步骤,PROC SQL可以通过
在启动发现过程之前优化查询。
因此,虽然可以访问字典表
通过SAS程序或使用SASHELP的数据步骤获取信息
在视图中,使用PROC-SQL通常效率更高
根据我的经验,使用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
您是否可以关闭SAS会话,重新打开SAS文件,更改执行顺序(先是PROC SQL,然后是data step program)并发布结果。(我不知道答案,但看到它会很有趣)。@Salva:Edited。谢谢你的建议。结果真的很有趣。很好的发现。我将亲自进行测试,因为我注意到,一旦定义的libnames中有大量表/列(数万),sashelp的性能就会下降。可以尝试逐步添加它们并计时,以查看字典的性能是否受到任何影响。也许字典方法更“聪明”,它的调查仅限于那些它知道需要阅读的文件……我认为定义视图会带来一些额外的开销——大多数在第一次运行后就消失了。有趣的是,SAS的页面声称开销并没有消失:字典表是从每一个查询的“发现过程”重新构建的。谢谢,Joe。我试图寻找一些关于SAS如何构造SASHELP视图的信息,以进行比较,但我没有找到足够的信息。如果你在某个时候遇到它,我希望你能把它添加到你的答案中。但同时,+1和接受。