我有一个加载脚本,每隔几分钟更新一次主表(将数据从登台表移动到prod表)。
然而,我注意到了一些事情。每当对prod表进行插入,更新或删除时,从prod表中读取的应用程序将返回针对数据库的新搜索的错误,或者由于对正在处理的数据库的查询而不是已经很慢了。
有没有办法防止这种情况发生?用户知道更新时间滞后(每10分钟),并且知道现在完成的搜索可以在另外10分钟内返回不同的信息(这是可以接受的)。
帮助!
UPDATE GS_CASE GC
set
(SYSTEM,
CASE_ID,
DISPLAY_ID,
OWNER_FIRSTNAME,
OWNER_MIDDLENAME,
OWNER_LASTNAME
) =
(
SELECT SYSTEM,
CASE_ID,
DISPLAY_ID,
OWNER_FIRSTNAME,
OWNER_MIDDLENAME,
OWNER_LASTNAME
FROM GS_STAGING_CASE GSC
where GC.SYSTEM = GSC.SYSTEM
AND GC.CASE_ID = GSC.CASE_ID
AND GSC.ACTION = 'UPDATE'
)
WHERE EXISTS
(
SELECT NULL
FROM GS_STAGING_CASE GSC
where GC.SYSTEM = GSC.SYSTEM
AND GC.CASE_ID = GSC.CASE_ID
)
;
--Deletes
DELETE GS_CASE
WHERE (SYSTEM, CASE_ID) IN
(SELECT GSC.SYSTEM, GSC.CASE_ID
FROM GS_CASE GC
INNER JOIN GS_STAGING_CASE GSC
ON GC.CASE_ID = GSC.CASE_ID
WHERE GC.SYSTEM = GSC.SYSTEM
AND GSC.ACTION = 'DELETE');
-- select count(1) Into v_count from GS_STAGING_CASE where ACTION = 'INSERT';
-- dbms_output.put_line('Rows in GS_STAGING_CASE = '||v_count);
--Inserts
INSERT
INTO GS_CASE
(
SYSTEM,
CASE_ID,
DISPLAY_ID,
OWNER_FIRSTNAME,
OWNER_MIDDLENAME,
OWNER_LASTNAME
)
SELECT GSC.SYSTEM,
GSC.CASE_ID,
GSC.DISPLAY_ID,
GSC.OWNER_FIRSTNAME,
GSC.OWNER_MIDDLENAME,
GSC.OWNER_LASTNAME
FROM GS_STAGING_CASE GSC WHERE GSC.ACTION = 'INSERT';
答案 0 :(得分:0)
我不太了解你的问题,但为了做得更好,你应该尝试优化你的过程。
在你的情况下,UPDATE正在进行两个无用的设置SYSTEM和CASE_ID在两个表上都是相同的,你不需要再次设置它们。
但是,为了做得更好,你可以尝试将所有树指令转换为MERGE女巫也会更快。这个应该做的工作。
merge into GS_CASE GC using (
SELECT SYSTEM, CASE_ID, DISPLAY_ID, OWNER_FIRSTNAME, OWNER_MIDDLENAME, OWNER_LASTNAME
FROM GS_STAGING_CASE GSC
where GC.SYSTEM = GSC.SYSTEM
AND GC.CASE_ID = GSC.CASE_ID
AND GSC.ACTION in ('UPDATE', 'DELETE', 'INSERT')
) GSC on ( GC.SYSTEM = GSC.SYSTEM AND GC.CASE_ID = GSC.CASE_ID AND GSC.ACTION in ('UPDATE','DELETE'))
when matched then update
set gc.DISPLAY_ID = gcs.DISPLAY_ID,
gc.OWNER_FIRSTNAME = gcs.OWNER_FIRSTNAME,
gc.OWNER_MIDDLENAME = gcs.OWNER_MIDDLENAME,
gc.OWNER_LASTNAME = gcs.OWNER_LASTNAME
delete
where gcs.action = 'DELETE'
when not matched then INSERT(SYSTEM, CASE_ID, DISPLAY_ID, OWNER_FIRSTNAME, OWNER_MIDDLENAME, OWNER_LASTNAME)
values (gcs.SYSTEM, gcs.CASE_ID, gcs.DISPLAY_ID, gcs.OWNER_FIRSTNAME, gcs.OWNER_MIDDLENAME, gcs.OWNER_LASTNAME)