代码之家  ›  专栏  ›  技术社区  ›  Dan

在SAS中同时运行多个查询

  •  3
  • Dan  · 技术社区  · 14 年前

    我有36个完全独立的查询,我需要定期运行,如果它们可以一次运行3个查询(如果我们尝试一次执行3个以上的查询,数据库会取消我们的查询),而不是每个查询都等待前一个查询完成,那么运行速度会快得多。

    我想这样做

    /* Some prep code here*/
    
    /* Launch batch 1 containing queries 1-12*/
    /* Immediately launch batch 2 (13-24) without waiting for 1-12 to finish*/
    /* Immediately launch batch 3 (25-36)*/
    
    /* Wait until all 3 batches are done and run some conclusion code*/
    

    或者,如果可能的话,只需将36个查询放在一起,让它一次运行多个查询,确保在任何给定的时间和任何一个完成的时间都不超过3个,只需从堆栈中添加下一个查询。

    使用SAS可以这样做吗?

    谢谢

    3 回复  |  直到 14 年前
        1
  •  3
  •   Fabio Prevedelli    14 年前

    我假设您有一个SAS服务器,并从本地计算机启动查询。 (如果你不在本地工作,这不是一个问题,你可以做一个rsubmit到一个产卵你在你的本地机器上) 即使使用SAS/Base,也可以通过一个代码为3的连接同时启动3个查询。 我在这里假设您不想共享工作库,并且是完全独立的查询

    option autosignon=yes;
    option sascmd="!sascmd";
    
    * some random data;
    data prova1;
    do i=1 to 20000000;
        x=rand('UNIFORM');
        output;
    end;
    run;
    
    data prova2;
    do i=1 to 20000000;
        y=rand('UNIFORM');
        output;
    end;
    run;
    *open connection to the server ;
    
    options comamid=tcp;
    filename rlink "D:\SAS\SASFoundation\9.2\connect\saslink\tcpwin.scr";
    %LET host1=nbsimbol59;
    %LET host2=nbsimbol59;
    
    signon remote=host1 script=rlink;
    signon remote=host2 script=rlink;
    
    rsubmit process=host1 wait=no inheritlib=(work=cwork);; 
    
       proc sort data=cwork.prova1 out=cwork.r1;
         by x;
       run;
    
       proc sort data=cwork.r1 out=cwork.r1a;
         by i;
       run;
    
    
    endrsubmit;
    
    
    rsubmit process=host2 wait=no inheritlib=(work=cwork);; 
    
       proc sort data=cwork.prova2 out=cwork.r2;
         by y;
       run;
    
       proc sort data=cwork.r2 out=cwork.r2a;
         by i;
       run;
    
    endrsubmit;
    
    /* Wait for both tasks to complete. */
    waitfor _ALL_ host1 host2;
    
    data r9;
         merge r1a (in=a) r2a (in=b);
        by i;
        if a and b;
        run;
    
    
    signoff host1;
    signoff host2;
    

    这个示例代码的唯一问题是,它将同时等待任务结束,并且atm它不会想到一种方法让它在一个查询结束时立即启动另一个查询,但我相信它可能有一些方法可以绕过它。

    对于你的另一个要求,我会考虑的:)

        2
  •  2
  •   Chang Chung    14 年前

    在某些平台上(当然是Windows和UNIX),如果配置允许SAS会话与OS交互,那么 SYSTASK WAITFOR 声明,你可以这样做:

    systask command "sas prog1.sas" taskname=sas1;
    systask command "sas prog2.sas" taskname=sas2;
    systask command "sas prog3.sas" taskname=sas3;
    waitfor _all_ sas1 sas2 sas3; /* suspend current session until the three jobs are finished */
    

    SYSTASK WAITFOR

        3
  •  0
  •   rkoopmann    14 年前