Oracle插入,删除或更新以及表锁

时间:2014-08-01 15:59:07

标签: sql oracle plsql

我有一个加载脚本,每隔几分钟更新一次主表(将数据从登台表移动到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';

1 个答案:

答案 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)