Oracle11g 在循环中运行类似步骤后,过程被卡住
我在下面有一个程序 NR_VTMATCH_SQLS表只有构建查询的代码片段,大约700行 这是一个匹配两个表的过程,共有700个组合,分别是name、SSN、TIN、DOB、Address、CityState、ZIP 组合看起来像这样,基本上我试着匹配所有可能的组合,从最强到最弱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
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小时。我正在研究全球温度和收集。这两件事我都不知道。