我用Proc Sql+OLEDB从同一数据库取数据,其中where子句有参考另一张表的筛选条件,如下所示:
proc sql noprint;
create talble a as
select * from Table1
where ID in (select ID from Table2);
quit;
这样做的话,时间耗费大致如下:
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
实际时间 1:39.79
CPU 时间 23.72 秒
但如果我把Table2的ID取出来,做成宏变量&ID_String,并加引号且用逗号分隔,再把上面的代码写成如下的形式:
proc sql noprint;
create talble a as
select * from Table1
where ID in (&ID_String);
quit;
所花时间则会大大减少:
NOTE: “PROCEDURE SQL”所用时间(总处理时间):
实际时间 2.98 秒
CPU 时间 0.26 秒
前一种情况只是多做了一次select,而且单独做这次select也花不了一秒钟的时间,为什么把它放在where里就会使整个Sql步多花几十倍的时间?
这里只能给这样的结果了,因为数据量大不好发上来,如果要试一下的话,也可以用下面的代码,里面用到了SASHELP库里的数据集,结果是类似的,只是数量级小很多:
有没有人遇到过这样的情况,有没有什么好的办法来解决,谢谢大家!