楼主: playmore
5316 4

关于Sql步中where子句效率的问题 [推广有奖]

已卖:1645份资源

学科带头人

2%

还不是VIP/贵宾

-

TA的文库  其他...

R相关

经济学相关

金融工程

威望
1
论坛币
16356 个
通用积分
8.6697
学术水平
372 点
热心指数
394 点
信用等级
341 点
经验
15297 点
帖子
1194
精华
1
在线时间
1332 小时
注册时间
2007-1-11
最后登录
2025-12-1

初级学术勋章 初级热心勋章 中级热心勋章

楼主
playmore 发表于 2014-7-11 14:14:00 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
我用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库里的数据集,结果是类似的,只是数量级小很多:


  1. proc sql noprint;
  2.         select distinct STATE into :aa_STATE separated by ' '
  3.                 from SASHELP.Zipcode
  4.                 order by STATE;
  5. quit;

  6. %let aa_STATE=%SYSFUNC(TRANSLATE(&aa_STATE,%STR(,),%STR( )));

  7. proc sql noprint;
  8.         create table want as
  9.                 select * from SASHELP.Class
  10.                         where Age in (select STATE from SASHELP.Zipcode);
  11. quit;

  12. proc sql noprint;
  13.         create table want as
  14.                 select * from SASHELP.Class
  15.                         where Age in (&aa_STATE);
  16. quit;
复制代码



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



二维码

扫码加我 拉你入群

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

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

关键词:Where 关于SQL HERE sql whe where

playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

沙发
macan1002 在职认证  发表于 2014-7-24 23:59:09
子查询的表Table2是一张多大的表?
字段ID的重复值多吗?如果重复值多,将子查询修改为select distinct ID from Table2后的效率又如何?

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

板凳
freerunning_sky 在职认证  发表于 2014-7-25 11:34:33
建立索引以后效率就高很多
  1. proc sql noprint;
  2.         select distinct STATE into :aa_STATE separated by ' '
  3.                 from SASHELP.Zipcode
  4.                 order by STATE;
  5. quit;

  6. %let aa_STATE=%SYSFUNC(TRANSLATE(&aa_STATE,%STR(,),%STR( )));

  7. proc sql;
  8.         create index state on sashelp.zipcode(state);
  9. quit;

  10. proc sql noprint;
  11.         create table want as
  12.                 select * from SASHELP.Class
  13.                         where Age in (select STATE from SASHELP.Zipcode);
  14. quit;

  15. proc sql noprint;
  16.         create table want as
  17.                 select * from SASHELP.Class
  18.                         where Age in (&aa_STATE);
  19. quit;
复制代码

报纸
ziyenano 发表于 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;

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-28 23:33