Usuário com melhor resposta
Como melhorar a performance desse select?

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)
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
- Sugerido como Resposta Junior Galvão - MVPMVP sexta-feira, 8 de junho de 2018 18:34
-
Deleted
- Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 12 de junho de 2018 18:50
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
- Sugerido como Resposta Junior Galvão - MVPMVP sexta-feira, 8 de junho de 2018 18:34
-
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 Mariano1776Banned quinta-feira, 7 de junho de 2018 19:59
-
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]