SASHELP视图与SQL字典表的性能

时间:2015-04-13 16:55:52

标签: performance sas

为什么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

2 个答案:

答案 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