Principales respuestas
Optimizar varios UPDATES

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
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
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 -
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