我有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吗?
由于
答案 0 :(得分:3)
我假设您有一台SAS服务器,而您从本地计算机上启动了查询。 (如果您不在本地工作并不是问题,您可以对本地计算机上的spawner进行rsubmit) 即使使用SAS / Base,也可以通过在单个代码中建立三个连接来同时启动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它不会想到一个方法让它一旦结束就启动另一个查询但我相信它可能有一些方法它
现在使用此代码,您可以轻松地一次启动3个查询,然后当它们最终再启动3个,依此类推。 对于你的其他要求,我会考虑一下:)
答案 1 :(得分:2)
在某些平台上(肯定是Windows和UNIX),如果配置允许您的SAS会话与操作系统交互,则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 */
答案 2 :(得分:0)