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中使用MACRO在SAS中创建连续变量