none
Como melhorar a performance desse select? RRS feed

  • Pergunta

  • Preciso retornar em um select a quantidade de reclamações do mês e a quantidade de reclamações do mês anterior.

    Fiz esse select, mas está muito lento.
    Podem me ajudar a melhorar a performance, por favor?

    select YEAR(A.DT_RECLAMACAO) AS ANO,  MONTH(A.DT_RECLAMACAO) AS MES, count(distinct B.PROTOCOLO) AS  QTDE_ANTERIOR, 
    count(distinct A.PROTOCOLO) AS QTDE_ATUAL
    from TBL032_AE_ATENDIMENTO_RECLAMACOES A
    left outer join TBL032_AE_ATENDIMENTO_RECLAMACOES B
    on YEAR(A.DT_RECLAMACAO) = YEAR(DATEADD(MONTH, 1, B.DT_RECLAMACAO))
    AND MONTH(A.DT_RECLAMACAO) = MONTH(DATEADD(MONTH, 1, B.DT_RECLAMACAO))
    group by  YEAR(A.DT_RECLAMACAO),  MONTH(A.DT_RECLAMACAO)
    order by YEAR(A.DT_RECLAMACAO),  MONTH(A.DT_RECLAMACAO)


    quinta-feira, 7 de junho de 2018 18:13

Respostas

  • Boa tarde,

    Experimente fazer uns testes com a query abaixo:

    with CTE_Count as
    (
        select 
            YEAR(DT_RECLAMACAO) AS ANO,
            MONTH(DT_RECLAMACAO) AS MES,
            count(distinct PROTOCOLO) AS QTDE
        from TBL032_AE_ATENDIMENTO_RECLAMACOES
        group by
            YEAR(DT_RECLAMACAO),
            MONTH(DT_RECLAMACAO)
    )
    
    select
        atu.ANO,
        atu.MES,
        ant.QTDE as QTDE_ANTERIOR,
        atu.QTDE as QTDE_ATUAL
    from CTE_Count as atu
    left join CTE_Count as ant
        on
            (atu.MES > 1 and ant.ANO = atu.ANO and ant.MES = atu.MES - 1) or
            (atu.mes = 1 and ant.ANO = atu.ANO - 1 and ant.MES = 12)
    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 7 de junho de 2018 18:27
  • Deleted
    segunda-feira, 11 de junho de 2018 00:06

Todas as Respostas

  • Boa tarde,

    Experimente fazer uns testes com a query abaixo:

    with CTE_Count as
    (
        select 
            YEAR(DT_RECLAMACAO) AS ANO,
            MONTH(DT_RECLAMACAO) AS MES,
            count(distinct PROTOCOLO) AS QTDE
        from TBL032_AE_ATENDIMENTO_RECLAMACOES
        group by
            YEAR(DT_RECLAMACAO),
            MONTH(DT_RECLAMACAO)
    )
    
    select
        atu.ANO,
        atu.MES,
        ant.QTDE as QTDE_ANTERIOR,
        atu.QTDE as QTDE_ATUAL
    from CTE_Count as atu
    left join CTE_Count as ant
        on
            (atu.MES > 1 and ant.ANO = atu.ANO and ant.MES = atu.MES - 1) or
            (atu.mes = 1 and ant.ANO = atu.ANO - 1 and ant.MES = 12)
    

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    quinta-feira, 7 de junho de 2018 18:27
  • Obrigada gapimex!

    Acabei descobrindo que o que estava demorando na query era o distinct dentro do count.
    E como tinha sido um banco importado, vi que a tabela não tinha chave primária e não tinha índice.
    Depois de ajustar tudo isso e remover o distinct (que era desnecessário), a query ficou rápida.

    Gratidão.

    • Sugerido como Resposta Mariano1776 quinta-feira, 7 de junho de 2018 19:59
    quinta-feira, 7 de junho de 2018 18:58
  • Obrigada gapimex!

    Acabei descobrindo que o que estava demorando na query era o distinct dentro do count.
    E como tinha sido um banco importado, vi que a tabela não tinha chave primária e não tinha índice.
    Depois de ajustar tudo isso e remover o distinct (que era desnecessário), a query ficou rápida.

    Gratidão.

    Danielle,

    O uso do comando Distinct em querys que fazem agrupamento de dados é algo bastante custoso para qualquer SGBD.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 8 de junho de 2018 18:35
  • Deleted
    sexta-feira, 8 de junho de 2018 23:12
  • Deleted
    segunda-feira, 11 de junho de 2018 00:06