Oracle更新SQL查询

时间:2018-12-03 10:52:09

标签: sql oracle sql-update query-performance

我的查询是这个。它没有显示错误。但是由于执行时间过长,Iam被迫关闭。请检查

update trans_rec a
set a.qty = (select b.qtydes from itbg_store_delchellan b where b.icode = 
a.icode and a.controlno=b.DEL_NO AND A.controlno IS NOT NULL) 
where exists 
    (select b.qtydes from itbg_store_delchellan b where b.icode = a.icode and 
    a.controlno=b.DEL_NO  AND A.controlno IS NOT NULL )

4 个答案:

答案 0 :(得分:1)

您可以按照以下方式重新编写查询:

UPDATE trans_rec a
SET a.qty =
    (SELECT b.qtydes 
    FROM itbg_store_delchellan b
    WHERE b.icode = a.icode and a.controlno=b.DEL_NO) 
WHERE a.controlno IS NOT NULL
AND EXISTS
(SELECT b.qtydes FROM itbg_store_delchellan b
WHERE b.icode = a.icode AND a.controlno=b.DEL_NO)

此后,您必须在字段搜索中添加索引,如下所示:

在这些字段上添加以下过滤器

  • b.icode
  • a.controlno
  • a.icode

答案 1 :(得分:0)

尝试此更新:

UPDATE A
SET     qty = B.qtydes 
from    trans_rec AS A
INNER JOIN itbg_store_delchellan B
             ON B.icode = A.icode 
             AND A.controlno=b.DEL_NO 
             AND A.controlno IS NOT NULL        

答案 2 :(得分:0)

您可以在Oracle中使用MERGE语句。

MERGE INTO trans_rec t USING 
( select DISTINCT icode,del_no,qtydes
       FROM itbg_store_delchellan s 
)
ON (
     s.icode = t.icode AND t.controlno = s.del_no
)
WHEN MATCHED THEN UPDATE SET t.qty = s.qtydes
WHERE t.controlno IS NOT NULL

答案 3 :(得分:0)

要提高性能,请在itbg_store_delchellan上创建一个复合索引:

create index idx_itbg_store_delchellan_3 on itbg_store_delchellan(icode, del_no, qtydes)

请注意,条件A.controlno IS NOT NULL是多余的。相关条件已经过滤掉NULL个值,因此您可以从两个子查询中删除它。