none
Lentidão para consultar com INNER JOIN dados na base com SQL Server 2008 Express Edition R2 com muitos registros RRS feed

  • Pergunta

  • Boa tarde pessoal,

    Estou com alguns problemas  em consultas com INNER JOIN em tabelas com um grande quantidade de informações.

    Atualmente na empresa onde trabalho, temos um processo chamado gera inventario, e esta se tornando muito lento em clientes com grande quantidade de dados nas tabelas,  nas quais tem consulta para gerar o inventario.

    Vou descrever como o processo acontece para que vcs possam dar as suas opiniões.

    Tabelas envolvidas no problema

    Total de registros

    Produto

    14.608

    EntradaSaida

               213.378

    EntradaSaidaProduto

             1.960.709

    Para cada produto e feito uma consulta no banco para buscar a soma das quantidades nas notas de entrada:

    SELECT sum(esp.Quantidade) Qtd 
    FROM EntradaSaida es  JOIN EntradaSaidaProduto esp   
    ON es.IDEntradaSaida = esp.IDEntradaSaida   
    WHERE esp.IDProduto =   2
    AND es.TipoDocumentoES IN ('Entrada','Entrada Transferência')
    AND esp.OperacaoEstoque  = 'Entrada de Estoque'   
    AND es.Situacao IN ('N','I' 'E','X')  
    AND esp.NumCFOP <>  '5.929'  AND esp.NumCFOP <>  '6.929'
    AND es.ENT_Conferida = 'True' AND es.IDEmpresa =1
    AND es.DataEntradaSaida  <= '12-31-2013'


    Para cada  produto e feito uma consulta no banco para buscar a soma das quantidades nas notas de saída:

    SELECT sum(esp.Quantidade) Qtd 
    FROM EntradaSaida es  JOIN EntradaSaidaProduto esp   
    ON es.IDEntradaSaida = esp.IDEntradaSaida   
    WHERE esp.IDProduto = 2
    AND  es.TipoDocumentoES IN ('ECF','Saída','Saída Transferência') 
    AND esp.OperacaoEstoque  = 'Saída de Estoque'  
    AND Situacao IN ('N','I','E','X')  
    AND es.NumCFOP  <> '5.929' AND es.NumCFOP <> '6.929'   
    AND es.ENT_Conferida = 'True'   AND es.IDEmpresa=1
    AND es.DataEntradaSaida  <= '12-31-2013'

    para esta consulta esta demorando em média um tempo de 1 minuto e 14 segundos,

    devido a este tempo não estamos conseguindo executar o processo, 

    Se tiverem alguma ideia do que pode estar acontecendo de errado, ou e isto mesmo que acontece com um banco com esta quantidade de registros?


    Oliveira

    quarta-feira, 8 de janeiro de 2014 17:30

Respostas

  • Marcio,

    Complementando à orientação do José, para visializar os índices de sua tabela utilize o comando sp_help, como exibido abaixo:

    sp_help EntradaSaida

    Para visualizar o Plano de Execução acredito que o método mais fácil é através do SSMS na consulta que você deseja verificar, clique "CTRL+SHIFT+ALT+L" ou clicar no ícone indicado no print-screen e vai aparecer o Plano como na imagem abaixo:

    Se aparecer uma mensagem de cor "verde" é que o SQL Server está indicando a necessidade de criar um índice para otimizar sua consulta. Clique com o botão direito e selecione "Missing Query" e ele vai gerar para você o código para criar o índice.

    Desta forma, você pode conhecer quais índices estão mais custosos e você deve analisar a necessidade de criar novos índices (caso não existam) ou efetuar um REBUILD dos índices muito fragmentados.

    Segue alguns links para te ajudar:

    http://technet.microsoft.com/pt-br/library/ms178071(v=sql.105).aspx

    http://technet.microsoft.com/pt-br/library/ms189858.aspx

    Não esqueça de marcar como resposta todos os posts úteis na sua solução.

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    quarta-feira, 8 de janeiro de 2014 20:17
    Moderador
  • Deleted
    quinta-feira, 9 de janeiro de 2014 11:32

Todas as Respostas

  • Deleted
    quarta-feira, 8 de janeiro de 2014 18:09
  • Jose, vamos por parte:

    - Teve oportunidade de analisar os planos de execução das consultas? Talvez neles já encontre algum gargalo.

    R.: Como posso ver estas informações?

    Verifique quais índices existem para as tabelas e se estão sendo utilizados na execução da consulta.

     Avalie também fragmentação de tabelas e índices.

    R.: Quando vc fala de indice, o que significa? se tem relação com a tabela produto ? se e FK?

    -Vi que existe coluna IDEmpresa; em uma mesma tabela estão armazenadas informações de várias empresas?

    R.: Este e padrão, mas não tem informações de varias empresas

    Me desculpe Jose, tenho bastante conhecimento em programação, mas ainda tem algumas coisas no SQL que estou pedalando.


    Oliveira

    quarta-feira, 8 de janeiro de 2014 18:45
  • Marcio,

    Complementando à orientação do José, para visializar os índices de sua tabela utilize o comando sp_help, como exibido abaixo:

    sp_help EntradaSaida

    Para visualizar o Plano de Execução acredito que o método mais fácil é através do SSMS na consulta que você deseja verificar, clique "CTRL+SHIFT+ALT+L" ou clicar no ícone indicado no print-screen e vai aparecer o Plano como na imagem abaixo:

    Se aparecer uma mensagem de cor "verde" é que o SQL Server está indicando a necessidade de criar um índice para otimizar sua consulta. Clique com o botão direito e selecione "Missing Query" e ele vai gerar para você o código para criar o índice.

    Desta forma, você pode conhecer quais índices estão mais custosos e você deve analisar a necessidade de criar novos índices (caso não existam) ou efetuar um REBUILD dos índices muito fragmentados.

    Segue alguns links para te ajudar:

    http://technet.microsoft.com/pt-br/library/ms178071(v=sql.105).aspx

    http://technet.microsoft.com/pt-br/library/ms189858.aspx

    Não esqueça de marcar como resposta todos os posts úteis na sua solução.

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    quarta-feira, 8 de janeiro de 2014 20:17
    Moderador
  • Deleted
    quarta-feira, 8 de janeiro de 2014 20:36
  • Obrigado Durval,

    Pelas dicas e pela explicação acima descrita, até então não tinha este conhecimento,

    vou aplicar nas minhas consultas, e te retorno o resultado.


    Oliveira

    quinta-feira, 9 de janeiro de 2014 10:46
  • Obrigado pelas dicas Jose.Diz, 

    Infelizmente a nossa empresa e pequena, e não temos uma equipe de DBA,

    neste caso nós desenvolvedores temos que fazer a parte de DBA,  e neste caso nós falta conhecimento do funcionamento do SQL, sabemos montar consultas, UPDATE, INSERT, DELETE, stord procedure, trigger, View, mas nós falta um conhecimento aprofundado do SQL, mas vou me inteirar um pouco mais sobre o conteúdo que vc passou.

    Obrigado.


    Oliveira

    quinta-feira, 9 de janeiro de 2014 10:54
  • Deleted
    quinta-feira, 9 de janeiro de 2014 11:32