2012-01-26 65 views
2

目前我的查詢是非常沉重的,表(表一)我需要更新含21萬條記錄 和另一個表(表二)含有15萬條記錄。對於表B中的所有記錄,表A中的記錄需要更新。 使用V $ SESSION_LONGOPS我可以看到查詢需要30個小時才能完成。因此,有誰知道如果它是更好的合併&更新或只是更新合併或更新

低於我的更新查詢,我已經在連接表上設置索引。這只是我創建的臨時表,我將在插入後刪除它。 (不是外部表)

UPDATE ITEM_LOC IL 
SET 
IL.STATUS= 'D'     , 
IL.LAST_UPDATE_DATETIME= SYSDATE , 
IL.LAST_UPDATE_ID = 'CNVOBJ_RNG' 
where exists 
(select il.item, il.loc from item_loc il 
join DC_ITEM_LOC DC_IL ON DC_IL.ITEM = IL.ITEM AND DC_IL.LOC = IL.LOC); 

回答

3

這不會做你期望的。這將更新每個記錄ITEM_LOC(如果ITEM_LOCDC_ITEM_LOC至少有一個共同的記錄)。您的查詢運行的每個行ITEM_LOC的完整子查詢,這就是爲什麼需要這麼長時間。

你的半連接應該這樣寫:

UPDATE ITEM_LOC IL 
    SET IL.STATUS = 'D', 
     IL.LAST_UPDATE_DATETIME = SYSDATE, 
     IL.LAST_UPDATE_ID = 'CNVOBJ_RNG' 
WHERE EXISTS (SELECT il.item, il.loc 
       FROM DC_ITEM_LOC DC_IL 
       WHERE DC_IL.ITEM = IL.ITEM 
        AND DC_IL.LOC = IL.LOC); 

更新一百萬行應該是幾秒鐘,而不是數小時。

+0

確定thanx的幫助,我幾乎更新了所有記錄: - | – Eve

0

試試這個樣子,就應該提高了很多;)

UPDATE ITEM_LOC 
SET 
IL.STATUS= 'D'     , 
IL.LAST_UPDATE_DATETIME= SYSDATE , 
IL.LAST_UPDATE_ID = 'CNVOBJ_RNG' 
FROM ITEM_LOC IL 
INNER JOIN DC_ITEM_LOC DC_IL ON DC_IL.ITEM = IL.ITEM AND DC_IL.LOC = IL.LOC