我有一个Activity表,它获取系统的所有表事件。所有系统表上的新订单,插入/删除等事件都将插入此表中。因此,对于Activity表,事件/秒的数量非常大。
现在,我想根据负责引发事件的表,根据业务逻辑处理传入事件。每个表可能有不同的程序来进行处理。
我使用了相同的链接 Parallelizing calls in PL/SQL
作为一种解决方案,我创建了多个dbms_scheduler
个作业,这些作业将同时被调用。所有这些作业(JOB1, JOB2--- - -JOB10
)将与ProcForAll_Processing
具有相同的过程( JOB_ACTION
),以实现并行处理。
begin
dbms_scheduler.run_job('JOB1',false);
dbms_scheduler.run_job('JOB2',false);
end;
ProcForAll_Processing
:此过程将依次调用其他6个程序
Proc1,proc2,proc3 --- -- - -- - Proc6
以顺序方式。我也想为这些实现并行处理。
P.S:我们无法创建更多工作来实现 ProcForAll_Processing
proc中的并行处理,因为它可能会导致消耗更多资源,而且DBA也不同意创建更多工作。另外,我不能用
dbms_parallel_execute
用于并行处理。
请帮助我,因为我真的很难完成它
答案 0 :(得分:3)
在没有工作的情况下,通常情况下是不可能的,并且会为此进行多次会话。除了少数例外,没有多线程PL\SQL
之类的东西。其中之一是并行执行sql 语句[1]。因此有一些尝试滥用这些东西用于并行执行PL \ SQL代码,例如试着看看这里[2]。
但正如我所说的那样滥用恕我直言。
参考:
答案 1 :(得分:3)
获得新的DBA。甚至更好,将它们从任何决策过程中删除。 DBA不应该检查您的代码,也不应该告诉您不创建工作,除非有一个很好的,特定的原因。
使用DBMS_SCHEDULER并行运行是迄今为止实现此结果的最简单,最常用的方法。 当然它将消耗更多资源,这就是并行性将不可避免地要做的事情。
另一个较差的选择是使用并行流水线表函数。这是一个先进的PL / SQL功能,在一个简单的例子中无法轻易解释。我能做的最好的就是推荐你the manual。
答案 2 :(得分:1)
您应该尝试使用DBMS_PARALLEL_EXECUTE(自RDBMS 11以来)。
https://blogs.oracle.com/warehousebuilder/entry/parallel_processing_in_plsql
https://oracle-base.com/articles/11g/dbms_parallel_execute_11gR2