全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
5206 4
2014-07-11
我用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库里的数据集,结果是类似的,只是数量级小很多:


复制代码



有没有人遇到过这样的情况,有没有什么好的办法来解决,谢谢大家!



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2014-7-24 23:59:09
子查询的表Table2是一张多大的表?
字段ID的重复值多吗?如果重复值多,将子查询修改为select distinct ID from Table2后的效率又如何?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-7-25 09:24:39
做成宏变量后,再做筛选,就不用去访问table2了,这样效率肯定会高一些。
但是做成宏变量也是需要访问table2的,把该部分时间算上,做成宏变量的效率是不是就不会高了?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-7-25 11:34:33
建立索引以后效率就高很多
复制代码
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-7-25 12:01:58
一楼的观点是正确的
proc sql;
select count(distinct STATE)  from SASHELP.Zipcode;  ##58   
select count(1) from SASHELP.Zipcode;   ##41761
差异主要是in 中的数据量差异

proc sql noprint;
        create table want as
                select * from SASHELP.Class
                        where Age NOT in (select distinct  STATE from SASHELP.Zipcode);
quit;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群