# 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
(
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,
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

select renaes, periodo, isnull(sexo,'X') sexo, ISNULL(et,'99') et, ISNULL(fi,'99') fi, tamizaje, gedad, count(*) casos

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
END

Aca 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
THEN (1) ELSE CASE WHEN [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[cod_item]='88141'
AND [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[valor_lab]='A'
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'
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'
THEN (4) ELSE CASE WHEN [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[cod_item]='87621'
AND [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[valor_lab]='N'
THEN (5) ELSE CASE WHEN [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[cod_item]='87621'
AND [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[valor_lab]='A'

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'
THEN (1) ELSE CASE WHEN [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[cod_item]='88141'
AND [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[valor_lab]='A'
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'
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'
THEN (4) ELSE CASE WHEN [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[cod_item]='87621'
AND [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[valor_lab]='N'
THEN (5) ELSE CASE WHEN [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[cod_item]='87621'
AND [BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[valor_lab]='A'
THEN (6) ELSE NULL END END END END END END<=(6) AND
THEN (1) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(20)
THEN (2) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(30)
THEN (3) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(40)
THEN (4) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(50)
THEN (5) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(60)
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
THEN (1) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(20)
THEN (2) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(30)
THEN (3) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(40)
THEN (4) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(50)
THEN (5) ELSE CASE WHEN CONVERT(int,[BDHIS_MINSA_REPORT].[dbo].[TRAMAHIS_DTSG].[edad_reg],0)>=(60)
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 viernes, 18 de mayo de 2018 20:30 Me confuindi
viernes, 18 de mayo de 2018 20:27

### Todas las respuestas

• Saludos,

Podrias decirnos que version de SQL y copiar el plan de ejecución

Blog: www.sqlservertoolbox.blogspot.com.mx

martes, 22 de mayo de 2018 0:16
• 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!

martes, 22 de mayo de 2018 13:58
• No veo doble filtro sobre la misma consula, tu querie tiene varias partes, 2 filtros son usados porque en si son 2 consultas distintas.

Esa era la duda, el plan que me marca es bastante especifico.

Blog: www.sqlservertoolbox.blogspot.com.mx

martes, 22 de mayo de 2018 14:56
• 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ú.

martes, 22 de mayo de 2018 15:26
• Saludos,

Seguramente por un blog publico, luego son usados con ejem otros fines, que bueno que esto solvento tu duda.

Blog: www.sqlservertoolbox.blogspot.com.mx

martes, 22 de mayo de 2018 15:50