SAS过程SQL不存在查询与数据步骤a=1 b=0



试图测量两个小数据集的性能,以便为一对大得多的数据集确定有效的执行方法。

*这项测试是在一个有32个观测结果的数据集和一个有37个观测值的数据集上进行的。

这两种方法给我的结果相同,但处理时间略有不同。我有一个简单的数据步骤:

data check;
merge d1(in=a) d2(in=b);
by ssn;
if a=0 and b=1;
run;

数据步骤方法(第一次执行)日志生成以下内容-

NOTE: There were 32 observations read from the data set WORK.D1.
NOTE: There were 37 observations read from the data set WORK.D2.
NOTE: The data set WORK.CHECK has 5 observations and 1 variables.
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.01 seconds

Proc SQL方法(在我们的特定情况下不存在查询)如下-

proc sql;
create table chck2 as
select b.* from d2 b
where not exists (select a.* from d1 a
                  where a.ssn=b.ssn)
;
quit;

sql proc在日志中打印以下内容-

NOTE: PROCEDURE SQL used (Total process time):
      real time           0.04 seconds
      cpu time            0.03 seconds

这两种方法都产生了相同的结果,创建了我的5个相同个体的最终数据集。虽然数据步处理似乎更快(即使只有几分之一秒),但这些性能结果总是正确的吗?数据步骤方法总是会获胜吗?这里的主要影响因素是什么?按特定顺序列出表格起到了作用吗?或者SAS会同时扫描两个表格吗?

仅供参考-我提到(第一次执行)是因为我从上面的实验和一般暴露中注意到,如果你随后处理数据步骤,SAS将比最初的执行更快地处理后续步骤。假设这与SAS在先前执行的步骤上具有内存有关。。。?

您永远不会从小型数据集中找到有意义的性能评估。开销将不可避免地打击任何类型的实际性能差异。PROC SQL在调用过程时有一点开销(百分之几秒),这比总执行时间还多。使用足够大的数据集运行测试,需要几分钟的时间——通常这是测试耗时过长和合法差异被开销/随机性压制之间的正确平衡。

至于更快的方法:如果数据集被排序,SAS知道它被排序了,那么两个过程在相同的时间内的可能性非常大。数据步骤合并非常快,SQL合并也是如此。

如果不进行排序,SQL可能(可能)会选择将存在的位置转换为哈希连接,这将比对大型数据集进行排序快得多。当然,这需要数据集适应内存。数据步骤中的排序和合并可能与SQL相同,也可能更慢,甚至更快,尽管我怀疑如果首先需要排序,通常不会快多少。如果需要的话,在数据步骤中有比排序/合并更快的解决方案(哈希或格式)。

PROC SQL语句的顺序而言;如果SQL能够弄清楚你在做什么并对其进行优化,这很可能无关紧要。然而,它可能会,因为SQL可能不容易找到最佳路径,所以一个顺序(通常是大数据集作为主数据集,小数据集作为子查询)可能会帮助SQL比另一个更容易地找到正确的方法。

而且,SAS运行第二次或更晚的时间更快的原因是,您的操作系统(或可能是您的文件系统)正在缓存读取,因此不必从磁盘重新读取SET文件。

最新更新