使用子查询提高更新的性能

时间:2020-06-04 20:38:22

标签: sql sql-server

我的以下选择效果很好,尽管性能不佳。而且我认为问题可能是我在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

1 个答案:

答案 0 :(得分:1)

据我所知,您想要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)上建立索引。