Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance SASHELP视图与SQL字典表的性能对比_Performance_Sas - Fatal编程技术网

Performance SASHELP视图与SQL字典表的性能对比

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

为什么SAS使用sashelp.vcolumn从数据步骤视图创建数据集比使用等效的SQL表dictionary.columns要花费更长的时间

我用
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和接受。