在循环

时间:2015-09-05 05:39:41

标签: oracle11g

我有以下程序。

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

这是一个匹配700个名称,SSN,TIN,DOB,地址,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

我匹配的表非常庞大,20M行对10M行,正如您所知,在每个步骤中我都在创建这些表的版本,因此在每个步骤中都会创建一个包含20M行的表然后放弃了。

我知道这是一种可怕的做法,非常费力,我以前有一个合并查询,没有创建表并遇到同样的问题。

问题在于每次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;

修改

我刚注意到它也跳过了第二个组合,你可以看到数字上的差距。这真的很奇怪,有什么想法吗?或者我应该就此发表一个单独的问题?

0 个答案:

没有答案