none
Optimizar varios UPDATES RRS feed

  • Pregunta

  • Hola a todos.

    Quiero lograr, lo que está más abajo con un ejemplo, pero de una forma mas óptima que no "cueste" tanto y que no tenga que recorrer una y otra vez la tabla,  ¿ tal vez usando COUNT OVER() o CTEs ?. Saludos a todos y gracias de antemano.

    declare @t1 table (c1 char,c2 int)
    insert into @t1 VALUES
      ('A',0)
    , ('A',1)
    , ('A',0)
    , ('A',0)
    , ('B',0)
    , ('B',0)
    , ('B',0)
    select * from @t1

    declare @t2 table (tipo char,cant0 int ,cant1 int)
    insert into @t2 (tipo) select DISTINCT c1 from @t1

    select * from @t2

    update @t2 set cant0 = cantidad
    from (select c1 as tipo,count( c1) as cantidad from @t1
    where c2 = 0 group by c1 ) t2
    join @t2 t1 on t2.tipo=t1.tipo

    update @t2 set cant1 = cantidad
    from (select c1 as tipo,count(c1) as cantidad from @t1
    where c2 = 1 group by c1 ) t2
    join @t2 t1 on t2.tipo=t1.tipo

    select * from @t2

    miércoles, 16 de noviembre de 2016 23:51

Respuestas

  • Con CTE

    ;

    WITH Totales AS (


    SELECT

    c1 as tipo,


    SUM(CASE c2 WHEN 0 THEN 1 ELSE 0 END) AS cantidad0,


    SUM(CASE c2 WHEN 1 THEN 1 ELSE 0 END) AS cantidad1


    FROM

    @t1


    GROUP

    BY C1)


    UPDATE

    @t2 set cant0 = cantidad0, cant1 = cantidad1


    FROM

    Totales


    JOIN

    @t2 t2 on totales.tipo=t2.tipo

    • Propuesto como respuesta HunchbackMVP jueves, 17 de noviembre de 2016 13:43
    • Marcado como respuesta Laura CeglzModerator miércoles, 23 de noviembre de 2016 15:40
    jueves, 17 de noviembre de 2016 7:15

Todas las respuestas

  • mi propuesta es

    update t2 set cant0=cantidad0,cant1=cantidad1 from @t2 t2 cross apply ( select c1 as tipo,
    										  sum( case when c2=0 then 1 else 0 end) as cantidad0,
    										  sum( case when c2=1 then 1 else 0 end) as cantidad1
    										  from @t1 t1 where t1.c1=t2.tipo  group by c1) b

    el plan de ejecución dado que no hay índices es mas o menos igual de malo en todos los casos, pero en el mio solo se hace una vez para las dos cantidades. la única diferencia está en donde hace el compute escalar (en mi caso al poner case when xxx lo hace antes, en el tuyo al ser un where lo hace después de agregar.


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    jueves, 17 de noviembre de 2016 7:09
    Moderador
  • Con CTE

    ;

    WITH Totales AS (


    SELECT

    c1 as tipo,


    SUM(CASE c2 WHEN 0 THEN 1 ELSE 0 END) AS cantidad0,


    SUM(CASE c2 WHEN 1 THEN 1 ELSE 0 END) AS cantidad1


    FROM

    @t1


    GROUP

    BY C1)


    UPDATE

    @t2 set cant0 = cantidad0, cant1 = cantidad1


    FROM

    Totales


    JOIN

    @t2 t2 on totales.tipo=t2.tipo

    • Propuesto como respuesta HunchbackMVP jueves, 17 de noviembre de 2016 13:43
    • Marcado como respuesta Laura CeglzModerator miércoles, 23 de noviembre de 2016 15:40
    jueves, 17 de noviembre de 2016 7:15