sql - 合并或更新

标签 sql oracle

目前我的查询量很大,我需要更新的表(表A)包含2100万条记录 另一个表(表B)包含1500万条记录。对于表 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);

最佳答案

这不会达到您的预期。这将更新 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);

更新一百万行应该只需要几秒钟,而不是几个小时。

关于sql - 合并或更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9018639/

相关文章:

sql - 在条件查询中转换SQL语句

mysql - 将 1 个任意行指定为每组的主要行

sql - Oracle/SQL ORDER BY 语句的问题

java - JDBC中如何知道DDL语句是否执行成功?

sql - 在查询中使用人类可读的常量

python - 在一个键列上加入两个数据帧/错误 : 'columns overlap but no suffix specified'

sql - 在 MySql 中使用别名

sql - 创建触发器以确保在一组列中只有一个 NON-NULL 并将其重新用于其他表

oracle - 如何使用 DATA_PUMP 导出到 S3 存储桶?

oracle - 在长时间运行的查询期间插入行时会发生什么