none
Lentidão consulta SQL para parâmetros diferentes RRS feed

  • Pergunta

  • Bom dia.

    Estou com um dilema.

    Tenho um banco de dados que utilizo com o SQL Server 2008R2 onde armazeno informações de várias empresas, (no meu caso dados de condomínios) e quando faço uma consulta simples usando um select com group by, com a mesma instrução, a qual irei colocar a baixo, quando utilizo uma referência do idEmpresa de uma empresa demora 57 seg para me retornar 875 registro, já utilizando outro idEmpresa, demora 0(zero) seg para me retornar 1065 registro. Dá para entender uma coisa dessas!?!?.

    Se alguem tiver uma luz para mim ajudar, desde já ficarei muitíssimo agradecido.

    Segue instrução que estou utilizando.

    Select M.idMovimento, U.numUnidade, SUM(D.Valor) as Valor
    from Movimentos M 
    Inner Join DetalhesMovimento D on (M.idMovimento = D.idMovimento)
    Inner Join Unidades U on (M.idUnidade=U.idUnidade)
    where M.Situacao = 'A' and M.idEmpresa = 20
    Group by M.idMovimento, U.numUnidade

    quinta-feira, 29 de novembro de 2018 11:19

Respostas

Todas as Respostas

  • Deleted
    quinta-feira, 29 de novembro de 2018 11:43
  • Boa tarde José Diz.

    Fiz uma verificação no seu artigo, que me esclareceu muito por sinal, e realmente a execução da mesma instrução gera planos de execuções diferentes.

    Mas ainda não consegui entender ainda o porque usando a mesma instrução, mesmo banco de dados, a consulta que retornaria uma menor quantidade de registros demanda mais tem que outra com mais registros, e esse mais é 1065 registro o que não e nada para uma consulta.

    Esta consulta estou fazendo diretamente no Management Studio, pela consulta.

    quinta-feira, 29 de novembro de 2018 17:07
  • Deleted
    quinta-feira, 29 de novembro de 2018 18:05
  • Ola José.

    Sim, estou disponibilizando a baixo os formatos XML e já te agradecendo pelo auxilio neste caso que me chamou a atenção e tenho certeza que vai me agregar muito aprendizado e conhecimento. Obrigado.

    https://drive.google.com/open?id=1Z27sxLVEl3MT_p1EXn5Jga8avNmeorY7

    https://drive.google.com/open?id=1HToHVRZQISu14JN7v4cGhWoZB9Yny_Vs

    https://drive.google.com/open?id=1Zz6WYcZFdgZEDjsb3PyrwELn0PCYy5oz

    https://drive.google.com/open?id=1X5kJK4Kv0-GwnvaHId0_ZbEEHEncvuB-

    quinta-feira, 29 de novembro de 2018 19:56
  • Deleted
    sexta-feira, 30 de novembro de 2018 10:58
  • Boa tarde meu caro,

    Tens de verificar o plano de execução das consultas para verificares as diferenças.

    Aconselho também a verificar as estatísticas pode ser que elas não estão actualizadas.

    Poderá haver algum campo que está aumentar a causar a lentidão, cada consulta tem os seus dados de retorno, nos dados da sua primeira consulta poderá ter um campo aí que está com valores que dificultam mais o "Sum()".

    Cpts

    sexta-feira, 30 de novembro de 2018 12:07
  • Boa tarde José e a Romario, obrigado por entrar na discussão do meu problema.

    José, verifiquei o por que do número absurdo real de linhas.

    Na tabela DetalhesMovimento toda, geral, com registro de todas as empresas possuem 381.844 registros e no retorno da consulta apenas das empresas na tabela Movimentos são 875 linhas, de forma que se multiplicarmos a tabela Movimentos (apenas da empresa que preciso) X DetalhesMovimento (dados de todas as empresas) chegamos no numeral de 334.113.500

    Mas ai poderia haver alguma coisa errada no meu select, pois bem, mas ai fica o por que para 1 unica empresa passo pelo problema e as demais não usando a mesminha consulta.

    Ai agora vem um detalhe que não avia comentado ainda. Esses dados da empresa 20 foram inseridos por uma rotina do meu sistema de conversão de dados sendo realizado inserts de todos os dados por uma while no meu programa. 

    sexta-feira, 30 de novembro de 2018 16:28
  • Deleted
    • Marcado como Resposta BrandoPrado sexta-feira, 30 de novembro de 2018 19:55
    sexta-feira, 30 de novembro de 2018 18:45
  • -- código #1
    USE banco;
    UPDATE STATISTICS Movimentos with fullscan; UPDATE STATISTICS DetalhesMovimento with fullscan; UPDATE STATISTICS Unidades with fullscan;

    Boa tarde José.

    Você resolveu o meu problema com o uso do UPDATE STATISTICS que tbm foi citado pelo Romario.

    Agora está fazendo a consulta em tempo normal.

    Muito obrigado pela atenção de vocês pelo meu caso.

    • Marcado como Resposta BrandoPrado sexta-feira, 30 de novembro de 2018 19:55
    • Não Marcado como Resposta BrandoPrado sexta-feira, 30 de novembro de 2018 19:56
    sexta-feira, 30 de novembro de 2018 19:55
  • Deleted
    sábado, 1 de dezembro de 2018 11:02
  • Brando,

    Um detalhe importante, o Update Statistics pode em algumas situações demandar um custo de processamento alto, então analise sempre o melhor horário.

    Outro comando que pode lhe ajudar muito é o sp_updatestats, trabalha da mesma maneira que o Update Statistics, mas que realiza também a atualização de estatísticas das tabelas internas do sistema.

    Além disso, em alguns casos o uso do comando DBCC UpdateUsage pode lhe ajudar na atualização da contagem das linhas das tabelas, mas esta comando deve ser executado em momentos de baixa utilização do seu ambiente.



    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]

    terça-feira, 4 de dezembro de 2018 11:18
  • José,

    Concordo, talvez um procedimento de desfragmentação de índices, ou até mesmo identificar possíveis índices ausentes poderá ajudar a melhorar o ambiente.


    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]

    terça-feira, 4 de dezembro de 2018 11:19