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

Posted

技术标签:

【中文标题】SAS Proc SQL 不存在查询与数据步骤 a=1 b=0【英文标题】:SAS Proc SQL Not Exist Query vs Data Step a=1 b=0 【发布时间】:2015-12-22 15:45:40 【问题描述】:

尝试测量两小组数据的性能,以便为更大的一对数据集确定一种有效的执行方法。

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

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

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

Data Step 方法(第一次执行)日志产生以下 -

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 在先前执行的步骤中具有内存有关...?

【问题讨论】:

【参考方案1】:

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

至于什么会更快:如果数据集已排序,并且 SAS 知道它已排序,那么这两个过程将在相同的时间量级上的可能性非常大。数据步合并非常快,SQL 合并也是如此。

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

至于PROC SQL 语句的顺序是什么;如果 SQL 可以弄清楚您在做什么并对其进行优化,那么它可能并不重要。但是,可能因为 SQL 可能不容易看到最佳路径,所以一个顺序(通常是大数据集作为主要数据集,较小数据集作为子查询)可能有助于 SQL 找出正确的方法比其他人容易。

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

【讨论】:

谢谢!听起来值得探索数据准备/确定准备是否值得提高速度(对数据集进行排序以进行合并等)。一如既往,谢谢。 顺便说一句 - not exists 在 SAS 中不太适用,现在我想了想;它通常没有优化为左连接(应该是这样)。编写左连接代码非常容易而且速度更快——尽管对于排序的数据集仍然不如数据步骤。你可以考虑写一个关于这个的问题,看看你会得到什么不同的答案......

以上是关于SAS Proc SQL 不存在查询与数据步骤 a=1 b=0的主要内容,如果未能解决你的问题,请参考以下文章

proc sql加入SAS中最接近日期

如何在PROC SQL中使用MACRO在SAS中创建连续变量

sas如何计算相邻观测的差值

在 SAS proc-sql 中将数据分组

根据来自另一个数据集的 PROC SQL 的结果更新 SAS 数据集

T:SAS/ Proc SQL - 选择进入:不在: