Usuario
Ayuda con una query que da dos barridos.

Debate general
-
Una pregunta, veo esta consulta y al querer optimizar puedo ver que da dos barridos en el when, aca les dejo la consulta.
Y abajo el barrido capturado del plan de ejecucion, el barrido lo saque del filtro.
ALTER PROCEDURE [dbo].[usp_TRAMA_BASE_CANCER_RPT_01_CUTERINO_NEW_AC]
with constante (id_cita, renaes, id_persona, periodo, fichafam, ubigeo, edad, sexo, et, fi, id_profesional, tamizaje, gedad)
as
(
select id_cita, renaes, id_persona, periodo, fichafam, ubigeo, edad_reg edad,
id_genero sexo, id_etnia et, id_financiador fi, id_profesional,
tamizaje =
case
when cod_item='88141' and valor_lab='N' and convert(int,edad_reg) between 50 and 64 then 1
when cod_item='88141' and valor_lab='A' and convert(int,edad_reg) between 50 and 64 then 2
when cod_item='88141.01' and valor_lab='N' and convert(int,edad_reg) between 30 and 49 then 3
when cod_item='88141.01' and valor_lab='A' and convert(int,edad_reg) between 30 and 49 then 4
when cod_item='87621' and valor_lab='N' and convert(int,edad_reg) between 30 and 49 then 5
when cod_item='87621' and valor_lab='A' and convert(int,edad_reg) between 30 and 49 then 6
end,
gedad =
case
when convert(int,edad_reg) < 20 then 1
when convert(int,edad_reg) between 20 and 29 then 2
when convert(int,edad_reg) between 30 and 39 then 3
when convert(int,edad_reg) between 40 and 49 then 4
when convert(int,edad_reg) between 50 and 59 then 5
when convert(int,edad_reg) between 60 and 69 then 6
when convert(int,edad_reg) >= 70 then 7
end
from [dbo].[TRAMAHIS_DTSG]
where cod_item in ('88141','88141.01','87621') and valor_lab in ('N','A') and id_tipedad_reg='A' and id_tipitem='D' and convert(int,edad_reg) between 0 and 120 )
select id_cita, renaes, id_persona, periodo, fichafam, ubigeo, edad, sexo, et, fi, id_profesional, tamizaje, gedad
into TRAMA_BASE_CANCER_RPT_01_CUTERINO_NOMINAL from constante where tamizaje IS NOT NULL and gedad IS NOT NULL
--- GENERACION DE TABLA CONSOLIDADA
INSERT INTO TRAMA_BASE_CANCER_RPT_01_CUTERINO_CONSOLIDADO
select renaes, periodo, isnull(sexo,'X') sexo, ISNULL(et,'99') et, ISNULL(fi,'99') fi, tamizaje, gedad, count(*) casos
-- INTO TRAMA_BASE_CANCER_RPT_01_CUTERINO_CONSOLIDADO
from TRAMA_BASE_CANCER_RPT_01_CUTERINO_NOMINAL group by
renaes, periodo, sexo, et, fi, tamizaje, gedad
--renaes, periodo, isnull(sexo,'X'), ISNULL(et,'99'), ISNULL(fi,'99'), tamizaje, gedad
ENDAca podemos ver el barrido que les comento.
CASE WHEN [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[cod_item]='88141'
AND [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[valor_lab]='N' AND CONVERT(in
t,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(50) AND CONVERT(
int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(64)
THEN (1) ELSE CASE WHEN [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[cod_item]='88141'
AND [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[valor_lab]='A'
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(50)
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(64)
THEN (2) ELSE CASE WHEN [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[cod_item]='88141.01'
AND [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[valor_lab]='N'
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(30)
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(49)
THEN (3) ELSE CASE WHEN [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[cod_item]='88141.01'
AND [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[valor_lab]='A'
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(30)
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(49)
THEN (4) ELSE CASE WHEN [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[cod_item]='87621'
AND [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[valor_lab]='N'
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(30)
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(49)
THEN (5) ELSE CASE WHEN [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[cod_item]='87621'
AND [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[valor_lab]='A'
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(30)
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(49)
THEN (6) ELSE NULL END END END END END END>=(1) AND
CASE WHEN [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[cod_item]='88141'
AND [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[valor_lab]='N'
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(50)
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(64)
THEN (1) ELSE CASE WHEN [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[cod_item]='88141'
AND [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[valor_lab]='A'
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(50)
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(64)
THEN (2) ELSE CASE WHEN [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[cod_item]='88141.01'
AND [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[valor_lab]='N'
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(30)
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(49)
THEN (3) ELSE CASE WHEN [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[cod_item]='88141.01'
AND [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[valor_lab]='A'
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(30)
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(49)
THEN (4) ELSE CASE WHEN [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[cod_item]='87621'
AND [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[valor_lab]='N'
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(30)
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(49)
THEN (5) ELSE CASE WHEN [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[cod_item]='87621'
AND [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[valor_lab]='A'
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(30)
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(49)
THEN (6) ELSE NULL END END END END END END<=(6) AND
CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<(20)
THEN (1) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(20)
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(29)
THEN (2) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(30)
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(39)
THEN (3) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(40)
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(49)
THEN (4) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(50)
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(59)
THEN (5) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(60)
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(69)
THEN (6) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(70)
THEN (7) ELSE NULL END END END END END END END>=(1) AND
CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<(20)
THEN (1) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(20)
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(29)
THEN (2) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(30)
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(39)
THEN (3) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(40)
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(49)
THEN (4) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(50)
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(59)
THEN (5) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(60)
AND CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)<=(69)
THEN (6) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(70)
THEN (7) ELSE NULL END END END END END END END<=(7)Lo saque del plan de ejecucion, queria saber por que el filtro esta haciendo el barrido dos veces?
Muchas Gracias !
- Editado AlexanderC1992 viernes, 18 de mayo de 2018 20:30 Me confuindi
Todas las respuestas
-
-
Muchas Gracias, la versión es la 2014 SP2. El plan de ejecución te lo adjunto acá
https://www.brentozar.com/pastetheplan/?id=HJHtZiW1Q
Hay muchas partes del plan de ejecución que no entiendo, he leído y tratado de profundizar pero no logro entender.
Lo que puedo entender que el optimizador de consultas esta haciendo el barrido dos veces pero no logro entender por que si la query tiene buena logica.
Espero puedas aclararme el panorama.
Muchas Gracias! Saludos!
- Editado AlexanderC1992 martes, 22 de mayo de 2018 14:00 Añadir información.
-
-
Entonces ese doble barrido es por las dos consultas?
Gracias! Entonces estoy mas tranquilo, intente ingresar a tu blog pero el websense me restringe, dice que tiene contenido sexual, tus querys son muy calientes jajaja
Gracias.
Saludos desde Perú.
- Editado AlexanderC1992 martes, 22 de mayo de 2018 15:26
-