更新表oracle

时间:2015-10-23 11:54:11

标签: oracle sql-update

我正在尝试更新oracle表的一行,update的值在另一个表中。在第一个表中,我有两行可以在第二个表中确定值。

我尝试制作这两句话:

merge into  participacion pn
using(
select valor_documento,id_tipo_documento,id_participante from 
participantes
) par
on (
pn.valor_documento=par.valor_documento
and pn.id_tipo_documento=par.id_tipo_documento
)
WHEN MATCHED THEN UPDATE
SET       pn.id_participante     = par.id_participante

或:

Update participacion pa set id_participante=(select id_participante
from participante where valor_documento=pa.valor_documento and id_tipo_documento=pa.id_tipo_documento)

在这两种情况下,更新都会耗费大量时间,因为我在表中有500000行,而在另一个表中有超过350万行。

您对如何进行此更新有其他想法吗?

2 个答案:

答案 0 :(得分:0)

您的MERGE语句可以改写为:

merge into participacion pn
using participantes par
  on (pn.valor_documento = par.valor_documento
      and pn.id_tipo_documento = par.id_tipo_documento)
when matched then
update set pn.id_participante = par.id_participante;

(即,由于您的源查询是从participantes表中选择所有内容,并且您没有进行任何计算,因此您不需要使用子查询,您可以直接引用该表)。

两种形式的MERGE是最直接,最有效的更新方式,恕我直言。那么,考虑到这一点,也许您需要查看索引 - 您要在两个表之间生成连接的行数是多少?也许来自participacion表的(valor_documento,id_tipo_documento)上的索引可以帮助加快速度,具体取决于预期合并会影响多少行。

答案 1 :(得分:0)

最后,我创建了一个像这样的索引

在participacion上创建INDEX PK_temporal(valor_documento,id_tipo_documento)

然后我更新了表格,更新仅在2分钟内完成,更新后我删除了索引。