1

我有一个 Activity 表,它正在获取系统的所有表事件。所有系统表上的新订单、插入/删除等事件都将插入到该表中。因此,对于 Activity 表来说,每秒事件数确实很大。

现在,我想根据负责引发事件的表来处理基于业务逻辑的传入事件。每个表可能有不同的过程来进行处理。

我在 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。我也想为这些实现并行处理。

PS:我们不能创建更多的作业来实现ProcForAll_Processingproc 中的并行处理,因为它可能会导致消耗更多的资源,而且 DBA 也不同意创建更多的作业。另外,我不能 dbms_parallel_execute用于并行处理。

请帮助我,因为我真的很难完成它

4

3 回答 3

3

获得一个新的 DBA。或者更好的是,将它们从任何决策过程中剔除。DBA 不应该审查您的代码,也不应该告诉您不要创建工作,除非有充分的具体原因。

使用 DBMS_SCHEDULER 并行运行是迄今为止实现此结果的最简单和最常见的方法。 当然它会消耗更多的资源,这就是并行性不可避免的。

另一个较差的选择是使用并行流水线表函数。这是一个高级的 PL/SQL 功能,无法在简单的示例中轻松解释。我能做的最好的就是让你参考手册

于 2016-01-23T22:13:04.977 回答
3

在一般情况下,没有工作是不可能的,它会为此创建多个会话。PL\SQL除了少数例外,没有多线程之类的东西。其中之一是并行执行 sql语句 [1]。所以有一些尝试滥用这些东西来并行执行 PL\SQL 代码,例如尝试看这里 [2]。

但正如我所说,这是滥用恕我直言。

参考:

  1. https://docs.oracle.com/cd/B19306_01/server.102/b14223/usingpe.htm
  2. http://www.williamrobertson.net/documents/parallel-plsql-launcher.html
于 2016-01-22T16:20:02.660 回答
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

于 2017-03-04T16:55:39.903 回答