我正在调整一些商店程序的工作得到这样的情况:
有一个程序让我们称之为sp_summary它会首先做一些准备工作,然后它会像串行的10个程序一样执行。基本上它是:
make_some
几乎每个都需要花费2分钟和20分钟,并且他们所做的只是创建一个临时用户从源表中捕获一些数据并计算一些列然后插入到目标表中。
问题是:
如何同时执行10个子sps,使每天20分钟变为每天2或5分钟。由于所有10个子sps都有相同的源表和相同的目标表,如何进行事务隔离以避免创建脏数据。
P.S:Informatica或SSIS或其他ETL工具不是一种选择。任何DBMS解决方案都会很棒
答案 0 :(得分:1)
您可以创建多个作业来执行每个存储过程。安排所有工作同时运行。
说J1到J10是你的工作,那么你的所有工作应该同时运行。
为准备工作再创建一份工作,并在上一个预定工作时间前几分钟安排工作。
答案 1 :(得分:1)
直接在SQL代码中不可能,因为它的性质是串行的。你必须在这里使用分而治之道。为此,您可以使用Service broker / sql agent / SSIS。
Service Broker:您可以设置队列,服务,激活过程并将最大队列读取器设置为10.这将设置队列以模拟获取10个任务。在激活过程中,您可以执行所需的过程。基本上,消息应包含您要运行的SQL。
SQL代理:您可以创建10个sql代理作业,以检查传入工作的同一个表(表a)。每个作业将一次迎合表中的一条记录并继续这样做,直到表为空。创建另一个过程,在“表a”中插入包含10个SQL调用的10行,并启动所有10个sql代理作业。
按照上面一位回应者的建议使用SSIS
IMO:我一直选择服务经纪人,因为它更具可分辨性。
答案 2 :(得分:0)
在 Oracle 中,您可以使用 DBMS_SCHEDULER 。
例如,
SQL> BEGIN
2 DBMS_SCHEDULER.create_job (
3 job_name => 'test_full_job_definition',
4 job_type => 'PLSQL_BLOCK',
5 job_action => 'BEGIN my_job_procedure; END;',
6 start_date => SYSTIMESTAMP,
7 repeat_interval => 'freq=hourly; byminute=0; bysecond=0;',
8 end_date => NULL,
9 enabled => TRUE,
10 comments => 'Job defined entirely by the CREATE JOB procedure.');
11 END;
12 /
PL/SQL procedure successfully completed.
您可以安排所有程序同时执行,而不是一个接一个地以程序方式执行。