很多的时候程序的比较并不一目了然.结果正确, 运行高效, 句法简单, 一定的通用性等等, 往往可以作为非正式的评判标准. 如果说某些标准具备主观性, 其中的前两个,正确性和效率, 往往更加客观,更加关键.
这里以前论坛上的某个问题以及给出的解决方案.因为可能牵扯较大的数据和较多的数据循环, 我这里做了简单的比较. 当然,结果和看起来或者原以为并不完全相同.
结果正确: 三个程序给定的结果完全一致
效率: 通过运行时间来决定.因为其中的运行时间的差异非常明显, 所以并没有反复运行实验.但是结果在不同的PC 和环境上也许有一定的差异.
简洁通用: 因人而异,不做深入比较.
具体问题来源.( https://bbs.pinggu.org/thread-3174189-1-1.html)
现有数据如下, 三个column (title,authors(不同的name用|隔开),number_authors)
Title Authors Number_authors
Title 1 Name A | Name B 2
Title 2 Name A | Name B | Name C 3..
大概有20000个observations,其中
1. title是unique的
2. number_authors 取值从1-200.
现在想做的是,对每一个observation生成一系列variables(5个):at_least_x_authors_repeat. X从1-5取整数值. 变量取值0或1也就是:at_least_1_authors_repeat; at_least_2_authors_repeat;at_least_3_authors_repeat;at_least_4_authors_repeat at_least_5_authors_repeat.
变量描述了在这组数据中有多少作者是重复的
方法 1- 一个DATA STEP
方法 2- 多个 SQL 过程
方法 3- 多个DATA STEP和SQL的混合.
运行结果
N = 1,000
1=0.89100003242492 seconds
2=8.24699997901916 seconds
3=3.28099989891052 seconds
N = 5,000
1=021.744000196457 seconds
2=499.838999986648 seconds
3=017.079999923706 seconds
N =10,000
1=0088.73000001907 seconds
2=2230.13800001144 seconds
3=0033.89900016785 second
N =20,000
1=342.348000049591 secondsN =50,000
1=2177.96100020408 seconds
2=0000.00000000000 seconds (not available)
3=0192.801999807357 seconds
如果想要比较结果,程序可以如下
从结果来看,如果数据记录较少的时候(比如N=1,000), 三个程序的运行时间类似. 如果N =5000, 方法2 变得缓慢. 如果N =10,000, 方法2的运行时间至少20倍长.方法3的时间最短, 只有方法1 的1/2. 如果数据进一步增加至20,000, 方法2 因为时间过长,没有测试. 而方法3的效率凸现优势,只有方法1 的1 /5左右.N =50,000, 方法 3 的优势更加明显.
略做总结:


其实SAS的SQL运行效率还可以,并不比Oracle这些数据库差,只是很多
时候数据库是安装的服务器上的,SAS通常都是PC版,才造成这种错觉。
jingju11 发表于 2014-9-9 19:51
谢谢你的说明。一些观点我可以测试一下;
(1)sas on server may be faster than on PC
(2) performanc ...
n obs = 20,000
Resulted dataset records = 970,484,186
Resulted data file size = 59.254 GB
Time consumed:
SAS SQL = 4564 seconds(76'04'')
Teradata SQL= 688 seconds(11'28'')
扫码加好友,拉您进群



收藏
