哪个更快,哪里声明或哪里有数据集选项

时间:2015-06-12 17:06:57

标签: sas

问题非常简单,哪一个更快?

考虑到我们在set语句中使用带有两个数据集的数据步骤,并且数据集中包含相同的变量。

从我听过和读过的内容,如果我们使用相同的条件对它们进行子集,比如说日期=" 10jan2014" d,结果将完全相同,使用上面的语句或下面的数据集选项两个数据集(其中=(date =" 10jan2014" d))。因为在任何事情进入PDV之前执行的地方。

是吗?

为了更好地理解这个问题,我创建了以下代码:

假设我们有这两个数据集。

data people1;
format birth date9.;
input name $ birth :date9.;
datalines;
John 18jan1980
Mary 20feb1980
;
run;

data people2;
format birth date9.;
input name $ birth :date9.;
datalines;
Peter 18mar1980
Judas 18jan1980
;
run;

我想创建一个包含这两个数据集的新数据集,但仅适用于出生日期等于18jan1980的人。 现在我可以使用where语句或where数据集选项。

使用where(数据集选项):

data everybody1;
set people1 (where=(birth="18jan1980"d))
    people2 (where=(birth="18jan1980"d));
run;

使用where语句:

data everybody2;
set people1
    people2;
where birth="18jan1980"d;
run;

新数据集现在具有完全相同的输出。但是哪一个更快?

感谢。

3 个答案:

答案 0 :(得分:3)

它们在性能方面完全相同。是的,where将只允许匹配结果加载到PDV。

根据文件(http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000202951.htm):

  

WHERE语句在进入之前选择观察   程序数据向量,使其成为更高效的编程   技术

以上引用是在讨论where vs if语句,但它确实确认where条款不会将数据带入PDV。

编辑:感谢Joe的链接,我将从文档中提供更好的摘录(http://support.sas.com/documentation/cdl/en/lrcon/67885/HTML/default/viewer.htm#p04fy20d8il3nfn1ssywe4f25k27.htm):

  

您可以在DATA步骤和SAS程序中使用WHERE表达式,   以及在窗口环境,SCL程序和数据集中   选项。 WHERE表达式在观察之前测试条件   被读入PDV。如果条件为真,则观察结果为   读入PDV并进行处理。如果条件是假的,那么   观察不会被读入PDV,并继续处理   下一个观察。这样可以节省大量成本   观察包含许多变量或很长的字符变量   (最多32K字节)。

答案 1 :(得分:3)

where语句与where数据集选项之间的区别在于它们如何生效:前者影响所有没有where数据集选项的输入数据集,以及后者仅影响它是一个选项的数据集(并覆盖where语句)。

有关详细信息,请参阅where data set optionwhere statement的文档以及Where Expression Processing概念。特别是,后者在性能方面没有区分两种where表达;它仅指定它们如何生效的差异。

答案 2 :(得分:0)

供参考,

我实际检查了

的cpu时间和I / O使用的差异
Keep/Drop 

使用set语句的数据步骤的语句,而不是set语句。

结果是如果没有使用set语句,则CPU时间和I / O Usage小于set语句的情况,特别是I / O使用量减少1/2。

如果在设置选项和数据步骤中都出现了保持/删除语句,则I / O等于观察值时,CPU时间会进一步缩短。

这可能会有所帮助,因为keep / drop语句也是编译时的统计信息。