我有以下程序。
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;
修改
我刚注意到它也跳过了第二个组合,你可以看到数字上的差距。这真的很奇怪,有什么想法吗?或者我应该就此发表一个单独的问题?