Oracle11g 在循环中运行类似步骤后,过程被卡住

Oracle11g 在循环中运行类似步骤后,过程被卡住,oracle11g,Oracle11g,我在下面有一个程序 NR_VTMATCH_SQLS表只有构建查询的代码片段,大约700行 这是一个匹配两个表的过程,共有700个组合,分别是name、SSN、TIN、DOB、Address、CityState、ZIP 组合看起来像这样,基本上我试着匹配所有可能的组合,从最强到最弱 518. First Name, First 4 letters of Last Name, SSN, ViantID, TIN, DOB, ZIP, City, State 516. First Name, Last

我在下面有一个程序

NR_VTMATCH_SQLS表只有构建查询的代码片段,大约700行

这是一个匹配两个表的过程,共有700个组合,分别是name、SSN、TIN、DOB、Address、CityState、ZIP

组合看起来像这样,基本上我试着匹配所有可能的组合,从最强到最弱

518. First Name, First 4 letters of Last Name, SSN, ViantID, TIN, DOB, ZIP, City, State
516. First Name, Last Name, SSN, ViantID, TIN, DOB, ZIP, City, State
514. First Name, First 4 letters of Last Name, SSN, ViantID, TIN, Address, ZIP, City, State
512. First Name, Last Name, SSN, ViantID, TIN, Address, ZIP, City, State
510. First Name, First 4 letters of Last Name, SSN, ViantID, TIN, Address, DOB, City, State
508. First Name, Last Name, SSN, ViantID, TIN, Address, DOB, City, State
506. First Name, First 4 letters of Last Name, SSN, ViantID, TIN, Address, DOB, ZIP
504. First Name, Last Name, SSN, ViantID, TIN, Address, DOB, ZIP
502. First Name, First 4 letters of Last Name, SSN, ViantID, TIN, Address, DOB, ZIP, City, State
500. First Name, Last Name, SSN, ViantID, TIN, Address, DOB, ZIP, City, State
我匹配的表非常大,2000万行与1000万行,正如你所知,在每一步中,我都会创建这些表的一个版本,所以在每一步中,都会创建一个2000万行的表,然后删除

我知道这是一种可怕的方法,非常累人,我以前使用合并查询,没有创建表,也遇到了同样的问题

问题是,每XX次迭代,它就会被卡住。就好像某个地方的记忆被填满了,一个台阶被挂起了。步骤本身没有问题,一旦我取消了这个过程,我就可以手动运行步骤,需要2分钟。 如果我从该步骤重新启动它,那么另一个XX步骤它将再次挂起(在最近的运行中XX=大约50)

有东西被填满了,我说得对吗?如果是,那是什么?我能做些什么呢

如果我错了,你有什么想法吗

多谢各位

我的程序

   DECLARE
    CURSOR CurRec  IS
        SELECT  MatchedID
                ,FacPracGrp
                ,SQL1
                ,SQL2
                ,SQL3
                ,SQL4
            FROM NR_VTMATCH_SQLS
           WHERE OriginalMatchedOn NOT BETWEEN 299 AND 499
        ORDER BY AutoID;
    SQLS CurRec%ROWTYPE;
BEGIN
    OPEN CurRec;
    LOOP
        FETCH CurRec INTO SQLS;
        EXIT WHEN CurRec%NOTFOUND;
        BEGIN
            EXECUTE IMMEDIATE 'DROP TABLE NR_VTMATCH_TMP';
        EXCEPTION
            WHEN OTHERS THEN
                IF SQLCODE != -942 THEN
                    RAISE;
                END IF;



                EXECUTE IMMEDIATE 'CREATE TABLE NR_VTMATCH_TMP AS
       SELECT    UniqueID
               ,' || SQLS.sql1 || '            FROM NR_VTMATCH_PROVS pr
          WHERE  ' || SQLS.sql4 || ' ';

                COMMIT;



                EXECUTE IMMEDIATE
                       'INSERT INTO NR_VTMATCH_MATCHED
       SELECT --+append
             DISTINCT mt.UniqueID ,mt.FacPracGrp, pr.UniqueID  ,  '''
                    || SQLS.sql3
                    || ''', '''
                    || sqls.FacPracGrp
                    || '''  FROM NR_VTMATCH_MATCH mt, NR_VTMATCH_TMP pr   WHERE         1 = 1   '
                    || SQLS.sql2
                    || ' ';



                COMMIT;


                DELETE FROM NR_VTMATCH_MATCH
                      WHERE UniqueID IN (SELECT UniqueID FROM NR_VTMATCH_MATCHED);


                COMMIT;
        END;
    END LOOP;
    CLOSE CurRec;
END;
编辑


我只是注意到它也会跳过每2个组合,你可以看到数字上的差距。这真的很奇怪,有什么想法吗?或者我应该就此单独提出一个问题?

无论如何,在运行时创建和删除对象都很痛苦;您是否考虑过使用全局临时表作为永久对象?或者是一个集合,虽然你可能有太多的数据,可能不实用,也许你可以成批工作。我不知道你为什么要使用临时数据;难道你不能在delete中直接让子查询从源表中识别所有ID吗?这都是为了提高速度。我尝试了许多不同的解决方案,这是最快的。我也不必删除任何内容。我想如果我删除用过的记录会更快。我绝望了,我的跑步时间是48小时。我正在研究全球温度和收集。这两件事我都不知道。