我目前开始使用 Oracle 数据库,通常必须从一个表更新到另一个表。由于我可以访问的数据库没有很多记录,如果我使用内连接执行更新,我无法及时评估更新的性能。但据我所知,有一个 Db 的表包含 50,000 条或更多记录。
所以我想做好准备,以便如果我必须修改有问题的表,我可以正确执行一条指令,而不是阻塞数据库的指令。
我经常使用的更新是这样的:
UPDATE (
SELECT Tabla1.Valor AS ValorAnterior
,Tabla2.Codigo AS ValorNuevo
FROM Tabla1
INNER JOIN Tabla2 ON Tabla1.Valor = Tabla2.Descripcion
WHERE Tabla1.Tipo = 1
) t
SET t.ValorAnterior = t.ValorNuevo;
在网上我看到了以下说明:
1) UPDATE Tabla1 SET Tabla1.Valor = (SELECT Tabla2.Codigo
FROM Tabla2
WHERE Tabla1.Valor = Tabla2.Descripcion)
WHERE Tabla1.Tipo=1
AND EXISTS (SELECT Tabla2.Codigo
FROM Tabla2
WHERE Tabla1.Valor = Tabla2.Descripcion);
2) MERGE INTO Tabla1 trg
USING (
SELECT t1.RowId AS rid
,t2.Codigo
FROM Tabla1 t1
JOIN Tabla2 t2 ON Tabla1.Valor = Tabla2.Descripcion
WHERE Tabla1.Tipo = 1
) src
ON (trg.RowId = src.rid)
WHEN MATCHED
THEN
UPDATE
SET trg.Valor = Codigo;
3) UPDATE (
SELECT t1.Valor
,t2.Codigo
FROM Tabla1 t1
INNER JOIN Tabla2 t2 ON t1.Valor = t2.Descripcion
WHERE t1.Tipo = 1
)
SET t1.Valor = t2.Codigo;
如果有人能指出我最有效的指导,我非常感激。
我知道使用旧格式的内连接和左连接连接器之间没有性能差异(事实上,由于查询顺序,习惯使用它们会更好)。此外,50,000 条记录不应该给您带来性能问题,Oracle 是一个设计用于处理具有数百万条记录的表的基础。
如果您有一个副本数据库(开发或测试),您可以执行执行指令然后回滚的练习。
除了执行计划提供给您的成本信息外,您还可以及时对性能进行简单的估计。