我有一个基于列的DB2-Blu表(DB2-Blu自行修复索引),每个对等组有30.000个对等组和50.000个值,总共15亿行。
我做了一项测试,将运行时与两个不同的流程进行比较:Proc Summary
和Proc 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可能不是最佳的吗?
答案 0 :(得分:1)
PROC SUMMARY
将执行数据库内处理,这将非常快(并且可能最终与{{{ 1}},或者可能更快)。
但是,这取决于DBMS和SAS。您还在此处添加了一个添加的图层 - 数据库加速软件本身。
SAS已经支持DB2很长一段时间了,但它只支持DB2-BLU 9.4M3(在当前版本之前的一个维护版本,大约一年半)。如果你没有9.4M3那么你几乎肯定没有直接的支持,因此可能没有利用BLU和/或没有利用数据库内处理。
这也是可能的,因为这是相当新的,数据库内处理并不像你所需要的那样实现;例如,我不知道是否支持PROC SQL
。 SAS不知道如何转换为DBMS的任何东西,无论是因为它是DBMS不支持的东西,还是因为SAS还没有实现对它的支持,将导致SAS下载整个表格。
所以我的建议是:
确认您有9.4 TS1M3或更新,如果没有,请获取它。升级到较新版本的SAS通常不收取任何费用,因此如果有些工作,这应该是可行的。
如果您这样做,请尝试运行更简单的摘要(删除所有选项,只需groupinternal
或类似)并查看 是否更快。那至少会告诉你一些事情。
让您的DBA或IT人员查看数据库和/或网络流量,看看PROC SUMMARY是否正在下载整个数据集; DBA应该能够告诉您SAS正在运行什么查询(如果它正在运行SQL摘要,或者它是否正在运行SELECT,然后运行摘要SAS端)和/或IT应该在至少能够告诉你在网络上的大小是什么。即使SAS在DB2中运行摘要,也许它没有运行优化查询。
然后,如果您有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
几乎花了两倍的时间。