SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1429|回复: 5
打印 上一主题 下一主题

请教:如何最高效的获得纪录数量

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2003-11-19 11:17:03 | 只看该作者

请教:如何最高效的获得纪录数量

我现在用select count(*)的方式,但是客户的数据量极大,客户抱怨计算记录数所花费的时间太长。
所以请问还有没有更高效的方法?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2003-11-19 12:10:38 | 只看该作者
select count(1)
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2003-11-19 13:20:12 | 只看该作者

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
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2003-11-19 13:46:20 | 只看该作者
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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2003-11-19 14:23:55 | 只看该作者
另外用函数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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2003-11-21 09:39:41 | 只看该作者
谢谢2位
由于我是Access to Oracle,所以
1、count(1)的效果不明显
2、dsid=open("");根本打不开远程的数据
3、count =nobs;有错,且效果也不理想

还是在客户处采取分批刷新的方式吧。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-1-5 19:08 , Processed in 0.110154 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表