none
Ayuda con una query que da dos barridos. RRS feed

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


    • Editado AlexanderC1992 martes, 22 de mayo de 2018 14:00 Añadir información.
    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