问题非常简单,哪一个更快?
考虑到我们在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;
新数据集现在具有完全相同的输出。但是哪一个更快?
感谢。
答案 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。
您可以在DATA步骤和SAS程序中使用WHERE表达式, 以及在窗口环境,SCL程序和数据集中 选项。 WHERE表达式在观察之前测试条件 被读入PDV。如果条件为真,则观察结果为 读入PDV并进行处理。如果条件是假的,那么 观察不会被读入PDV,并继续处理 下一个观察。这样可以节省大量成本 观察包含许多变量或很长的字符变量 (最多32K字节)。
答案 1 :(得分:3)
where
语句与where
数据集选项之间的区别在于它们如何生效:前者影响所有没有where
数据集选项的输入数据集,以及后者仅影响它是一个选项的数据集(并覆盖where
语句)。
有关详细信息,请参阅where data set option和where 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语句也是编译时的统计信息。