我有一张包含许多重复行的表格。
假设我有一个包含10百万行的表A和一个没有索引或主键的单个列。
我先做了这个。我创建了另一个表B,然后执行此操作
INSERT INTO B (col1) SELECT DISTINCT (col1) FROM A;
问题是性能很慢。然后我找到了这个命令
proc sort data=A out=B noduprecs;
by col1;
run;
只用了2秒钟。
为什么使用proc sort
然后使用insert select
?
proc排序是如何工作的,最终能够在没有任何索引的情况下处理这么多行?
我在网上找不到任何解释。
TIA
答案 0 :(得分:1)
我认为我们需要更多地了解您的SAS配置,因为我肯定没有看到与您相同的结果。这是我用来测试的代码:
测试代码
创建一些测试数据,10M行,使用0到1000之间的随机整数:
data x;
do cnt=1 to 10000000;
x = floor(rand("Uniform") * 1000);
output;
end;
drop cnt;
run;
尝试使用proc排序对其进行排序并保留不同的值。多次运行以获得平均时间:
proc sort data=x out=test1 nodupkey;
by x;
run;
尝试使用proc sql方法。再次,多次运行以获得平均时间:
proc sql noprint;
create table test2 as
select distinct x
from x
order by 1
;
quit;
尝试使用'插入'方法。多次运行:
proc sql noprint;
create table b like x;
insert into b (x) select distinct (x) from x;
quit;
<强>结果
在我的机器上,SAS9.4,Windows 64位,proc排序平均花费了大约4秒,而sql排序大约需要5秒。所以是的,proc排序对这个数据集的运行速度要快一些。更改要排序的行数,列数,字段类型以及键的基数都可以更改这些结果。
insert into语句以3.2秒的速度运行最快。您的表是否正在写入SAS数据集?或者它位于另一个数据库中?这将对您的结果产生最大的影响,并且应该是选择要运行的步骤的决定因素。
答案 1 :(得分:0)
你可以用
更快proc sort data=A(keep=col1) out=B nodupkey;
by col1;
run;
尝试将INSERT和SORT与:
进行比较proc sql;
create table B as select distinct col1 from A;
quit;
体验只是告诉我们PROC SORT比PROC SQL实现中的排序/不同更快。对于所有情况而言,这并不是一份官方声明,而且并非总是如此。
A和B表是SAS BASE libname吗?
INSERT版本的问题也可能是由于目标是预定义的,因此肯定会插入一些值来检查以适应目标字段,这在创建新表时可能更便宜。