[英]Improve performance of an update with sub-query
我下面的 select 工作正常,虽然性能不好。 而且我认为问题可能是我重复了低于 9x 的子查询,我确信它可以改进。
我认为问题在于,如果要更新的列,我对每个重复以下子查询:
select top 1
gestor_transac.XXXXXXX
from
gestor_transac
where
CONVERT(date,gestor_transac.fecha_tran) <= CONVERT(date,gestor_val_pos.fecha_trade)
and gestor_transac.uid_producto = gestor_val_pos.uid_producto
and id_cartera = @Arg_ID_cartera
order by
gestor_transac.fecha_tran desc
有人可以看看吗?
update gestor_val_pos
set cantidad = (select top 1 gestor_transac.shabal
from gestor_transac
where CONVERT(date,gestor_transac.fecha_tran) <= CONVERT(date,gestor_val_pos.fecha_trade) and gestor_transac.uid_producto= gestor_val_pos.uid_producto and id_cartera= @Arg_ID_cartera
order by gestor_transac.fecha_tran desc
)
, coste_div_loc = (select top 1 gestor_transac.Coste_LOC_BAL
from gestor_transac
where CONVERT(date,gestor_transac.fecha_tran) <= CONVERT(date,gestor_val_pos.fecha_trade) and gestor_transac.uid_producto= gestor_val_pos.uid_producto and id_cartera= @Arg_ID_cartera
order by gestor_transac.fecha_tran desc
)
, coste_div_car = (select top 1 gestor_transac.Coste_CAR_BAL
from gestor_transac
where CONVERT(date,gestor_transac.fecha_tran) <= CONVERT(date,gestor_val_pos.fecha_trade) and gestor_transac.uid_producto= gestor_val_pos.uid_producto and id_cartera= @Arg_ID_cartera
order by gestor_transac.fecha_tran desc
)
, POS_cum_Inflows = (select top 1 gestor_transac.TRAN_Cum_inflows
from gestor_transac
where CONVERT(date,gestor_transac.fecha_tran) <= CONVERT(date,gestor_val_pos.fecha_trade) and gestor_transac.uid_producto= gestor_val_pos.uid_producto and id_cartera= @Arg_ID_cartera
order by gestor_transac.fecha_tran desc
)
, POS_cum_Outflows = (select top 1 gestor_transac.TRAN_Cum_Outflows
from gestor_transac
where CONVERT(date,gestor_transac.fecha_tran) <= CONVERT(date,gestor_val_pos.fecha_trade) and gestor_transac.uid_producto= gestor_val_pos.uid_producto and id_cartera= @Arg_ID_cartera
order by gestor_transac.fecha_tran desc
)
, Descripcion = (select top 1 gestor_transac.descrpcion
from gestor_transac
where CONVERT(date,gestor_transac.fecha_tran) <= CONVERT(date,gestor_val_pos.fecha_trade) and gestor_transac.uid_producto= gestor_val_pos.uid_producto and id_cartera= @Arg_ID_cartera
order by gestor_transac.fecha_tran desc
)
, Custodio = (select top 1 gestor_transac.custodio
from gestor_transac
where CONVERT(date,gestor_transac.fecha_tran) <= CONVERT(date,gestor_val_pos.fecha_trade) and gestor_transac.uid_producto= gestor_val_pos.uid_producto and id_cartera= @Arg_ID_cartera
order by gestor_transac.fecha_tran desc
)
, Fecha_compra = (select top 1 gestor_transac.fecha_tran
from gestor_transac
where CONVERT(date,gestor_transac.fecha_tran) <= CONVERT(date,gestor_val_pos.fecha_trade) and gestor_transac.uid_producto= gestor_val_pos.uid_producto and id_cartera= @Arg_ID_cartera
order by gestor_transac.fecha_tran desc
)
, Fecha_vencimiento = (select top 1 gestor_transac.fecha_vencimiento
from gestor_transac
where CONVERT(date,gestor_transac.fecha_tran) <= CONVERT(date,gestor_val_pos.fecha_trade) and gestor_transac.uid_producto= gestor_val_pos.uid_producto and id_cartera= @Arg_ID_cartera
order by gestor_transac.fecha_tran desc
)
where id_cartera= @Arg_ID_cartera and uid_producto= @Arg_UID_pr
据我所知,你想apply
:
update gvp
set cantidad = gt.shabal,
. . .
from gestor_val_pos gvp cross apply
(select top (1) gt.*
from gestor_transac gt
where convert(date, gt.fecha_tran) <= convert(date, gvp.fecha_trade) and
gt.uid_producto = gvp.uid_producto and
gt.id_cartera = @Arg_ID_cartera
order by gt.fecha_tran
) gt;
然后你想要一个关于gestor_transac(uid_producto, id_cartera, fecha_tran)
的索引。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.