2012-01-26 6 views
2

現在、私のクエリは非常に重く、更新する必要があるテーブル(テーブルA)には2,100万レコードが含まれています と別のテーブル(テーブルB)には1,500万レコードが含まれています。テーブル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_LOCおよびDC_ITEM_LOCに少なくとも1つのレコードが共通する場合)。クエリではの各サブフリートが実行されます。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

OKありがとう: - | – 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