SAS中文论坛

标题: 请教:如何最高效的获得纪录数量 [打印本页]

作者: shiyiming    时间: 2003-11-19 11:17
标题: 请教:如何最高效的获得纪录数量
我现在用select count(*)的方式,但是客户的数据量极大,客户抱怨计算记录数所花费的时间太长。
所以请问还有没有更高效的方法?
作者: shiyiming    时间: 2003-11-19 12:10
select count(1)
作者: shiyiming    时间: 2003-11-19 13:20
标题: Re: 请教:如何最高效的获得纪录数量
[quote="shiyiming":1e94d]我现在用select count(*)的方式,但是客户的数据量极大,客户抱怨计算记录数所花费的时间太长。
所以请问还有没有更高效的方法?[/quote:1e94d]

用data步set选项nobs + stop语句,或者其它不需要读入数据的方法。

654  data _1;
655      do i =1 to 100000000;
656          output;
657      end;
658  run;

NOTE: The data set WORK._1 has 100000000 observations and 1 variables.
NOTE: DATA statement used:
      real time           1:59.40
      cpu time            53.90 seconds

[color=blue:1e94d]678  data _null_;
679      *count  =nobs;
680      put _all_;
681      stop;
682      set work._1 nobs=nobs;
683  run;[/color:1e94d]
nobs=100000000 i=. _ERROR_=0 _N_=1
NOTE: DATA statement used:
      real time           0.00 seconds
      cpu time            0.00 seconds

[color=red:1e94d]/*这个方法的时间消耗和数据的多少没有什么关系*/[/color:1e94d]
[color=blue:1e94d]
/*另外我看了一下内存的消耗。和上面两位的方法相比,好象也未增加,不知为什么,按理下面第一种方法内存消耗大些,请各位知道原因的指教
还有,请问willon,用count(1) 好象没有太大变化,有什么技巧?*/[/color:1e94d]
700  options fullstimer;
701  data _null_;
702      *count  =nobs;
703      put _all_;
704      stop;
705      set work._1 nobs=nobs;
706  run;

nobs=100000000 i=. _ERROR_=0 _N_=1
NOTE: DATA statement used:
      real time           0.00 seconds
      user cpu time       0.00 seconds
      system cpu time     0.00 seconds
      Memory                            95k


707  proc sql;
708      select count(*)
709      from _1;
710  quit;
NOTE: PROCEDURE SQL used:
      real time           36.60 seconds
      user cpu time       31.67 seconds
      system cpu time     0.93 seconds
      Memory                            125k
作者: shiyiming    时间: 2003-11-19 13:46
willon,看来是我错了,count(1)是有道理的,消耗的内存较少些,可能还和变量数有关。

我的记忆中select count(*) /(1)消耗的内存应该比nobs=小些。

712  proc sql;
713      select count(1)
714      from _1;
715  quit;
NOTE: PROCEDURE SQL used:
      real time           36.40 seconds
      user cpu time       36.01 seconds
      system cpu time     0.00 seconds
      Memory                            93k
[color=blue:4548d]
/*上述测试不一定代表确切情况,请yiming先生测试您自己的数据,再权衡这四种消耗*/[/color:4548d]
作者: shiyiming    时间: 2003-11-19 14:23
另外用函数attrn(SAS File I/O 类)也可以不要读入数据,不妨一试。

data _null_;
        dsid=open("work._1");
        [color=red:96c6b]nobs=attrn(dsid, 'nobs'); /*除了nobs选项外还有其它诸多关于data set的信息的选项*/[/color:96c6b]
        put _all_;
run;
作者: shiyiming    时间: 2003-11-21 09:39
谢谢2位
由于我是Access to Oracle,所以
1、count(1)的效果不明显
2、dsid=open("");根本打不开远程的数据
3、count =nobs;有错,且效果也不理想

还是在客户处采取分批刷新的方式吧。




欢迎光临 SAS中文论坛 (http://mysas.net/forum/) Powered by Discuz! X3.2