Empecemos:
Código SQL
[-]update aux_infplanta
set aux_infplanta.m3producidos =
(select (art_planta.m3xhora * (infplanta.hmetro_termino - infplanta.hmetro_inicio))
from infplanta, art_planta, aux_infplanta
where infplanta.infnro = aux_infplanta.numinf
and aux_infplanta.codart = art_planta.codart
and infplanta.planta = art_planta.codplanta
and infplanta.fecha > (:FECHA)
)
El update recorre los 50.000 registros de aux_infplanta.
Para cada registro ejecuta el select. Este select no está filtrado, pues la línea aux_infplanta.codart = art_planta.codart no sabe si se refiere al registro de la tabla que se está "updateando" o al registro que se está "seleccionando".
Deberías utilizar alias para resolver este caso:
Código SQL
[-]update aux_infplanta UPD
set aux_infplanta.m3producidos =
(select (art_planta.m3xhora * (infplanta.hmetro_termino - infplanta.hmetro_inicio))
from infplanta, art_planta, aux_infplanta
where infplanta.infnro = aux_infplanta.numinf
and aux_infplanta.codart = art_planta.codart
and UPD.codart = aux_infplanta.codart
and infplanta.planta = art_planta.codplanta
and infplanta.fecha > (:FECHA)
)
Aqui le digo que el select me devuelva solo los registros que contienen el mismo CODART que el registro que estoy "updateando".
Te propongo que para que el SQL sea más simple utilices JOINS y ALIAS:
Código SQL
[-]update aux_infplanta UPD
set aip.m3producidos =
(select (ap.m3xhora * (infplanta.hmetro_termino - infplanta.hmetro_inicio))
from infplanta ip
join art_planta ap on ip.planta = ap.codplanta
join aux_infplanta aip on aip.codart = ap.codart
where
ip.infnro = aip.numinf and
ip.fecha > (:FECHA)
and UPD.codart = aux_infplanta.codart
)
Ten en cuenta que para hacer los joins es conveniente utilizar todos los campos de las Foreign Keys. No conozco tu base de datos, por lo que quizás no sea la mejor manera de hacer los joins.