SAS代码执行时间

Time of execution of SAS code

我正在为我的 SAS 考试学习,我发现了以下问题:

给定一个包含 5000 个观测值的数据集,并给出以下两个数据集(第一个的子集)。

Data test1 (keep= cust_id trans_type gender);
Set transaction;
Where trans_type = ‘ Travel’ ;
Run;

Data test2;
Set transaction (keep= cust_id trans_type gender);
Where trans_type = ‘ Travel’ ;
Run;

我。以上两个数据集(test1,test2)中哪一个会占用更少

我认为两者花费相同的时间到 运行 因为基本上两者都以不同的顺序发出相同的指令。我是正确的?或者指令的顺序会影响 运行时间?

测试 2 到 运行 所需的时间更少,因为它引入的变量更少。

这本书正在寻找的答案是 test2 会更快。那是因为两者有的区别:

test1: Read in all variables, only write out 3 of them

test2: Read in 3 variables, write out all variables read

SAS 具有基于物理数据集结构的一些优势,使其能够更有效地读取数据集的子集,尤其是当这些变量连续存储时。

但是,在现实世界的场景中,这可能是正确的,也可能不是正确的,特别是在 5000 行的数据集中,可能看不出两者之间有任何区别。例如:

data class1M;
  set sashelp.class;
  do _i = 1 to 1e6;
    output;
  end;
run;

data test1(keep=name sex);
  set class1M;
run;

data test2;
  set class1M(keep=name sex);
run;

这两个数据步骤花费相同的时间长度。这可能是因为数据集被读入内存,然后根据需要获取位——250MB 的数据集不足以触发任何效率。

但是,如果你添加一堆其他变量:

data class1M;
  set sashelp.class;
  length a b c d e f g h i j k l 8;
  do _i = 1 to 1e6;
    output;
  end;
run;

data test1(keep=name sex);
  set class1M;
run;

data test2;
  set class1M(keep=name sex);
run;

现在 运行 test1test2 需要更长的时间。那是因为 test1 的数据集现在不适合内存,所以它是按位读取的,而 test2 的数据集确实适合内存。使其逐行更大,比如 1000 万行,test1 和 test2 都需要很长时间 - 但 test2 会稍微短一些。