为什么proc排序比插入选择更快

时间:2014-12-09 11:11:41

标签: sql sas

我有一张包含许多重复行的表格。

假设我有一个包含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

2 个答案:

答案 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版本的问题也可能是由于目标是预定义的,因此肯定会插入一些值来检查以适应目标字段,这在创建新表时可能更便宜。