PL/SQL中的多线程

PL/SQL中的多线程,sql,multithreading,oracle,plsql,Sql,Multithreading,Oracle,Plsql,我有外光标 CURSOR C1 IS SELECT CBAT.*, ROWID ROWID2 FROM table CBAT WHERE ATTRIBUTE3 IS NULL AND ATTRIBUTE4 = 'COSTPROCESSED' AND AP_DOCUMENT_REF IS NULL; CURSOR C2(C1_MONTH VARCHAR2, C1_YEAR VARCHAR2, C_CMCA_PROJE

我有外光标

 CURSOR C1 IS
      SELECT CBAT.*, ROWID ROWID2
        FROM table CBAT
       WHERE ATTRIBUTE3 IS NULL
         AND ATTRIBUTE4 = 'COSTPROCESSED'
         AND AP_DOCUMENT_REF IS NULL;
CURSOR C2(C1_MONTH VARCHAR2, C1_YEAR VARCHAR2, C_CMCA_PROJECT_ID VARCHAR2, C_CMCA_EMPLOYEE_NUMBER VARCHAR2)
和1个内部光标

 CURSOR C1 IS
      SELECT CBAT.*, ROWID ROWID2
        FROM table CBAT
       WHERE ATTRIBUTE3 IS NULL
         AND ATTRIBUTE4 = 'COSTPROCESSED'
         AND AP_DOCUMENT_REF IS NULL;
CURSOR C2(C1_MONTH VARCHAR2, C1_YEAR VARCHAR2, C_CMCA_PROJECT_ID VARCHAR2, C_CMCA_EMPLOYEE_NUMBER VARCHAR2)
而且处理看起来像

FOR I IN C1 LOOP       
    BEGIN
      FOR J IN C2(I.MONTH,
                  I.YEAR,
                  I.CMCA_PROJECT_ID,
                  I.CMCA_EMPLOYEE_NUMBER) LOOP
处理:-对于游标c1中的每个记录,我需要检查第二个游标C2中是否存在从游标c1开始的员工、项目编号和月份。如果条件满足,我需要更新一个自定义表。所以这个过程需要很长时间。如何缩短处理时间

在我的C1游标中有1000条记录,单个记录在游标c2中处理。对于每一行来说,这需要花费大量的时间,而对于所有1000条记录来说,这需要超过2个小时

我知道多线程的概念,但不知道如何实现。谁能告诉我如何实施这个概念

根据我的要求,我需要检查从光标c1到光标c2的每一条记录。由于我面临性能问题,请建议我如何实现。

这个概念称为作业,您可以发布它们,以便在后台处理它们

示例来自:

这个概念被称为作业,您可以发布它们,以便在后台处理它们

示例来自:


嵌套游标通常比将查询合并为一个游标要慢。但您还没有说明对每个返回的行执行的处理。如果每一行的单独处理可能与其他行冲突,那么您可能会引入争用,这会使事情变得更糟,而不是更好——甚至这取决于您希望一次处理的数量。正如@AlexPoole已经指出的那样,您应该在循环中添加有关您正在做什么的信息。我的猜测是,这两个循环可以被一个SQL语句替换,该语句可以在几秒钟而不是几小时内运行。多线程很可能会给您带来锁定问题,而不是改进。尝试尽可能多地删除循环,并在SQL中尽可能多地准备。嵌套游标通常比将查询合并为一个游标要慢。但您还没有说明对每个返回的行执行的处理。如果每一行的单独处理可能与其他行冲突,那么您可能会引入争用,这会使事情变得更糟,而不是更好——甚至这取决于您希望一次处理的数量。正如@AlexPoole已经指出的那样,您应该在循环中添加有关您正在做什么的信息。我的猜测是,这两个循环可以被一个SQL语句替换,该语句可以在几秒钟而不是几小时内运行。多线程很可能会给您带来锁定问题,而不是改进。尝试尽可能多地删除循环,并在SQL中尽可能多地准备。我建议使用DBMS_调度程序而不是DBMS_作业。DBMS_作业早就被弃用了,根本没有理由在新代码中使用它。谢谢Patrick。但是如果你告诉我solution@user3351248:您必须在一个过程中拆分性能密集型部分,在job_action中传递的,您可以参数化该调用。我建议使用DBMS_调度程序,而不是DBMS_作业。DBMS_作业早就被弃用了,根本没有理由在新代码中使用它。谢谢Patrick。但是如果你告诉我solution@user3351248:您必须在一个过程中拆分性能密集型部分,您可以在job_action中传递该部分,然后对该调用进行参数化。