2012-01-26 63 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