use*_*330 5 sql db2 statistics sas proc-sql
我需要一个理论上的答案.
想象一下,你有一个包含15亿行的表(该表是基于列的DB2-Blu创建的).
您正在使用SAS,并且您将通过使用Proc Summary类似的最小值/最大值/平均值,标准偏差值和百分位数-10,百分位数90来通过您的对等组进行一些统计.
例如,您有30.000个对等组,并且每个对等组中有50.000个值(总计1.5亿个值).
另一种情况是,您有300万个对等组,并且每个对等组中也有50个值.所以你再次拥有15亿的价值.
如果您拥有较少的对等组但每个对等组中的值更多,它会更快吗?或者,对于更多的对等组,它会更快,但每个对等组的值会更少.
我可以测试第一个案例(每个对等组有30.000个对等组和50.000个值),大约需要16分钟.但我无法测试第二种情况.
如果我有300万个对等组,并且每个对等组中有50个值,你能否为运行时写一个近似的预测?
这个问题还有一个方面.如果我使用这些统计数据会更快Proc SQL吗?
示例代码如下:
proc summary data = table_blu missing chartype;
class var1 var2; /* Var1 and var2 are toghether peer-group */
var values;
output out = stattable(rename = (_type_ = type) drop = _freq_)
n=n min=min max=max mean=mean std=std q1=q1 q3=q3 p10=p10 p90=p90 p95=p95
;
run;
Run Code Online (Sandbox Code Playgroud)
因此,这里有很多事情需要考虑。
第一点(很可能是性能方面最大的一点)是将数据从 DB2 获取到 SAS。(我假设这不是 SAS 的数据库实例——如果是,请纠正我)。那是一张大桌子,将其移动到电线上需要时间。因此,如果您可以使用 SQL 语句在 DB2 中计算所有这些统计信息,那么这可能是您最快的选择。
假设您已将表下载到 SAS 服务器:
按变量排序的表CLASS比未排序的表处理起来要快得多。如果 SAS 知道表已排序,则无需扫描表中的记录即可进入组,它可以执行块读取而不是随机 IO。
如果表未排序,则组数越大,则必须进行的表扫描越多。
关键是,在未排序的过程中,从 HD 获取数据到 CPU 的速度至关重要。
从这里开始,你就会遇到内存和CPU问题。PROC Summary 是多线程的,SAS 将一次读取 N 组。如果组大小可以适合为该线程分配的内存,那么就不会有问题。如果组大小太大,则 SAS 将不得不进行分页。
我将问题缩小到 15M 行示例:
%let grps=3000;
%let pergrp=5000;
Run Code Online (Sandbox Code Playgroud)
未排序:
NOTE: There were 15000000 observations read from the data set
WORK.TEST.
NOTE: The data set WORK.SUMMARY has 3001 observations and 9
variables.
NOTE: PROCEDURE SUMMARY used (Total process time):
real time 20.88 seconds
cpu time 31.71 seconds
Run Code Online (Sandbox Code Playgroud)
已排序:
NOTE: There were 15000000 observations read from the data set
WORK.TEST.
NOTE: The data set WORK.SUMMARY has 3001 observations and 9
variables.
NOTE: PROCEDURE SUMMARY used (Total process time):
real time 5.44 seconds
cpu time 11.26 seconds
Run Code Online (Sandbox Code Playgroud)
=============================
%let grps=300000;
%let pergrp=50;
Run Code Online (Sandbox Code Playgroud)
未排序:
NOTE: There were 15000000 observations read from the data set
WORK.TEST.
NOTE: The data set WORK.SUMMARY has 300001 observations and 9
variables.
NOTE: PROCEDURE SUMMARY used (Total process time):
real time 19.26 seconds
cpu time 41.35 seconds
Run Code Online (Sandbox Code Playgroud)
已排序:
NOTE: There were 15000000 observations read from the data set
WORK.TEST.
NOTE: The data set WORK.SUMMARY has 300001 observations and 9
variables.
NOTE: PROCEDURE SUMMARY used (Total process time):
real time 5.43 seconds
cpu time 10.09 seconds
Run Code Online (Sandbox Code Playgroud)
我运行了几次,运行时间相似。排序时间大致相等并且更快。
组越多/每组越少,未排序的速度更快,但看看总 CPU 使用率,它更高。我的笔记本电脑有一个非常快的 SSD,因此 IO 可能不是限制因素 - HD 能够满足多核 CPU 的需求。在 HD 较慢的系统上,总运行时间可能会有所不同。
最后,它很大程度上取决于数据的结构以及服务器和数据库的具体情况。