为什么Proc Sql比sum-function更快?

时间:2017-04-21 20:02:11

标签: sql sas db2 proc-sql

我有一个基于列的DB2-Blu表(DB2-Blu自行修复索引),每个对等组有30.000个对等组和50.000个值,总共15亿行。

我做了一项测试,将运行时与两个不同的流程进行比较:Proc SummaryProc Sql如下所示:

proc summary data = table_blu  nodisplay nway missing chartype;
   /* Var1 and var2 are toghether peer-group  */
   class var1 var2 / groupinternal; 
   var values;

   output out = stattable
   sum=sum 
;
run;

仅计算通过对等组的总结,并花费14 min

然后我用Proc SQL进行了类似的计算,如下所示:

proc sql;
   create table stattable as
   select var1, var2, sum(values);
   from table_blu
   group by var1, var2;
quit;

Proc SQL仅占用1,26 min。与使用14 min进程的Proc Summary相比,运行时间肯定要少得多。

怎么会有这么大的差异?它可以发生,因为该表是基于列的吗?对于基于列的表,SAS可能不是最佳的吗?

2 个答案:

答案 0 :(得分:1)

如果数据库支持并且受SAS 支持,

PROC SUMMARY将执行数据库内处理,这将非常快(并且可能最终与{{{ 1}},或者可能更快)。

但是,这取决于DBMS和SAS。您还在此处添加了一个添加的图层 - 数据库加速软件本身。

SAS已经支持DB2很长一段时间了,但它只支持DB2-BLU 9.4M3(在当前版本之前的一个维护版本,大约一年半)。如果你没有9.4M3那么你几乎肯定没有直接的支持,因此可能没有利用BLU和/或没有利用数据库内处理。

这也是可能的,因为这是相当新的,数据库内处理并不像你所需要的那样实现;例如,我不知道是否支持PROC SQL。 SAS不知道如何转换为DBMS的任何东西,无论是因为它是DBMS不支持的东西,还是因为SAS还没有实现对它的支持,将导致SAS下载整个表格。

所以我的建议是:

  1. 确认您有9.4 TS1M3或更新,如果没有,请获取它。升级到较新版本的SAS通常不收取任何费用,因此如果有些工作,这应该是可行的。

  2. 如果您这样做,请尝试运行更简单的摘要(删除所有选项,只需groupinternal或类似)并查看 是否更快。那至少会告诉你一些事情。

  3. 让您的DBA或IT人员查看数据库和/或网络流量,看看PROC SUMMARY是否正在下载整个数据集; DBA应该能够告诉您SAS正在运行什么查询(如果它正在运行SQL摘要,或者它是否正在运行SELECT,然后运行摘要SAS端)和/或IT应该在至少能够告诉你在网络上的大小是什么。即使SAS在DB2中运行摘要,也许它没有运行优化查询。

  4. 然后,如果您有9.4 TS1M3,请打开SAS支持轨道,并提供2和3中的详细信息以及原始问题。他们应该能够告诉你是否期望这个查询在数据库上运行,或者它是否总是首先下载表,然后如果是,你可以做些什么(如果有的话) )。

答案 1 :(得分:0)

假设源表位于work libname内而不是远程数据库中,proc summary的执行速度应该比proc sql快。

我在下面通过创建一个包含190米观测值的表格进行测试,并使用这两种技术总结数据:

332  data x;
333    set sashelp.class;
334    do i=1 to 10000000;
335      output;
336    end;
337  run;

NOTE: There were 19 observations read from the data set SASHELP.CLASS.
NOTE: The data set WORK.X has 190000000 observations and 6 variables.
NOTE: Compressing data set WORK.X decreased size by 15.12 percent.
      Compressed is 118495 pages; un-compressed would require 139604 pages.
NOTE: DATA statement used (Total process time):
      real time           1:23.30
      cpu time            1:04.79


338
339
340  proc summary data=x noprint nway missing chartype;
341     class sex age / groupinternal;
342     var height;
343     output out=stattable sum=sum;
344  run;

NOTE: Multiple concurrent threads will be used to summarize data.
NOTE: There were 190000000 observations read from the data set WORK.X.
NOTE: The data set WORK.STATTABLE has 11 observations and 5 variables.
NOTE: Compressing data set WORK.STATTABLE increased size by 100.00 percent.
      Compressed is 2 pages; un-compressed would require 1 pages.
NOTE: PROCEDURE SUMMARY used (Total process time):
      real time           1:04.79
      cpu time            1:11.65


345
346
347  proc sql noprint;
348    create table xx as
349    select sex, age, sum(height)
350    from x
351    group by 1,2
352    ;
NOTE: SAS threaded sort was used.
NOTE: Compressing data set WORK.XX increased size by 100.00 percent.
      Compressed is 2 pages; un-compressed would require 1 pages.
NOTE: Table WORK.XX created, with 11 rows and 3 columns.

353  quit;
NOTE: PROCEDURE SQL used (Total process time):
      real time           2:09.56
      cpu time            1:47.12

正如您所看到的,proc sql几乎花了两倍的时间。