测试数据如下
1085 proc sql;
1086 create table abcom AS
1087 select a.* from a inner join b
1088 on a.x=b.x;
NOTE: 表 WORK.ABCOM 创建完成,有 2001228 行,3 列。
1089 ;
1090 quit;
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
实际时间 4.56 秒
CPU 时间 4.61 秒
1091 data d;
1092 if _N_=1 then do;
1093 declare hash h1(dataset:"work.b");
1094 declare hiter i1("h1");
1095 h1.definekey("x");
1096 h1.definedata("x");
1097 h1.definedone();
1098 end;
1099
1100 set a end=EOF;
1101
1102 rc=h1.find();
1103 if rc=0 then output;
1104
1105 keep x y z;
1106 run;
NOTE: 从数据集 WORK.B 读取了 200 个观测。
NOTE: 从数据集 WORK.A 读取了 10000000 个观测。
NOTE: 数据集 WORK.D 有 2001228 个观测和 3 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
实际时间 6.34 秒
CPU 时间 4.00 秒
1107 proc sql;
1108
1109 create table newAB as
1110
1111 select a.* from a
1112
1113 where exists (select *
1114
1115 from b
1116
1117 where a.x = b.x);
NOTE: 表 WORK.NEWAB 创建完成,有 2001228 行,3 列。
1118
1119 quit;
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
实际时间 2:52.17
CPU 时间 2:52.01
1120
1121 proc sql;
1122
1123 create table newAB as
1124
1125 select a.* from a
1126
1127 where x in (select x
1128
1129 from b
1130
1131 );
NOTE: 表 WORK.NEWAB 创建完成,有 2001228 行,3 列。
1132
1133 quit;
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
实际时间 14.56 秒
CPU 时间 14.53 秒
1134 proc sort data=a;by x;run;
NOTE: 从数据集 WORK.A 读取了 10000000 个观测。
NOTE: 数据集 WORK.A 有 10000000 个观测和 3 个变量。
NOTE: “PROCEDURE SORT”所用时间(总处理时间):
实际时间 13.93 秒
CPU 时间 14.71 秒
1134! quit;
1135 proc sort data=b;by x;run;
NOTE: 从数据集 WORK.B 读取了 200 个观测。
NOTE: 数据集 WORK.B 有 200 个观测和 1 个变量。
NOTE: “PROCEDURE SORT”所用时间(总处理时间):
实际时间 0.01 秒
CPU 时间 0.01 秒
1135! quit;
1136
1137 data ccc;
1138 merge a(in=a1) b(in=b1);
1139 by x;
1140 if a1 and b1;
1141 run;
NOTE: 从数据集 WORK.A 读取了 10000000 个观测。
NOTE: 从数据集 WORK.B 读取了 200 个观测。
NOTE: 数据集 WORK.CCC 有 2001228 个观测和 3 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
实际时间 2.98 秒
CPU 时间 2.96 秒
可能的效率打分
A inner join
A - hash
B in subquery
B+ sort+merge
??where exist
对于海量数据,我个人偏好于各种join
hash在处理一多对应时需要相应修改
sort+merge比较不感冒。。。个人喜好