none
Como melhorar estas querys? RRS feed

  • Pergunta

  • Pessoal estas 2 querys demoram 10 segundos para serem executadas....

    Segue querys....

    SELECT  
        COUNT(DISTINCT [a].[CARTAO]) CARTOES , COUNT([a].[CARTAO]) OPERACOES_REALIZADAS
    FROM
          dbo.TB_CSU_OPERACOES_REALIZADAS_CARTOES a
          JOIN [dbo].[TbCartao] b ON left(RIGHT([a].[CARTAO],15),13) = LEFT(RIGHT([b].[NumeroCartao],15),13)  COLLATE SQL_Latin1_General_CP1_CI_AS
          WHERE
          [b].[ClienteId] = 4057 AND
          [b].[IdProduto] = 1
          AND [CODIGO4] != 9990
          AND [a].[DATA] BETWEEN @DTINICIO AND @DTFIM + 1




       SELECT  [a].[CARTAO],[a].[DATA], [a].[DESCRICAO],[a].[VALOR],[a].[LOCALIDADE]
    FROM
          dbo.TB_CSU_OPERACOES_REALIZADAS_CARTOES a
          JOIN [dbo].[TbCartao] b ON left(RIGHT([a].[CARTAO],15),13) = LEFT(RIGHT([b].[NumeroCartao],15),13) COLLATE SQL_Latin1_General_CP1_CI_AS
          WHERE
          [b].[ClienteId] = 4057 AND
          [b].[IdProduto] = 1
          AND [CODIGO4] != 9990
          AND [a].[DATA] BETWEEN @DTINICIO AND @DTFIM


    Alguem sabe um jeito de melhora-las?
    • Editado PedroHSantos segunda-feira, 10 de dezembro de 2012 16:46
    segunda-feira, 10 de dezembro de 2012 16:45

Respostas

  • Pedro,

    Então, aparentemente está ocorrendo esse evento (sniffing).  Sua query pode continuar com os parâmetros normalmente, porém, voce terá que dizer ao otimizador do sql que suas variáveis possui valor conhecido, ou seja, valores que serão usado SOMENTE para a geração de um plano de execução otimizado. Portando, isso não influenciará no resultado de sua query...
    No final de sua query, usando as variáveis como vc fez no inicio, adicione: OPTION (OPTIMIZE FOR(@DTINICIO ='2012-12-01', @DTFIM ='2012-12-30'))

    Verifique novamente o tempo levado para processar.

    at.

    Rafael



    segunda-feira, 10 de dezembro de 2012 18:40

Todas as Respostas

  • Pedro,

    Você tem indices nessas tabelas?


    Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta PedroHSantos segunda-feira, 10 de dezembro de 2012 17:13
    • Não Marcado como Resposta PedroHSantos segunda-feira, 10 de dezembro de 2012 17:13
    segunda-feira, 10 de dezembro de 2012 17:10
  • Sim... vou refazer o indice delas.... estas tabelas tem 5 milhões de linhas... talvez seja isso...
    segunda-feira, 10 de dezembro de 2012 17:11
  • Pedro,

    Você chegou a verificar o plano de execução destas querys?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    segunda-feira, 10 de dezembro de 2012 17:13
  • Verifiquei e está tudo blz.... pelo visto terei q refazer os indices dessa tabela.... se nao der certo vou ter q particionar ela...
    segunda-feira, 10 de dezembro de 2012 17:20
  • Pedro,

    Você conseguiu recriando os indices?


    Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    segunda-feira, 10 de dezembro de 2012 17:37
  • Pelo visto terei q particionar essa tabela... recriei os indices e as consultas agora duram 8 segundos, 2 segundos a menos....
    segunda-feira, 10 de dezembro de 2012 18:06
  • Boa tarde Pedro,

    Os testes que voce está fazendo, você está sempre usando com variáveis? Como no seu exemplo?
    Você jah fez algum teste fixando as datas diretamente na sua query, pra ter certeza que não está ocorrendo o parameter sniffing... (Ocorre qdo usando variáveis como parâmetros - plano de execução ruim)

    at.
    rafael

    segunda-feira, 10 de dezembro de 2012 18:25
  • Rafael,

    Executei sim e foi mais rapido... porém essas querys recebe parametros, as 2 querys ficam em uma proc...
    segunda-feira, 10 de dezembro de 2012 18:28
  • Pedro,

    Então, aparentemente está ocorrendo esse evento (sniffing).  Sua query pode continuar com os parâmetros normalmente, porém, voce terá que dizer ao otimizador do sql que suas variáveis possui valor conhecido, ou seja, valores que serão usado SOMENTE para a geração de um plano de execução otimizado. Portando, isso não influenciará no resultado de sua query...
    No final de sua query, usando as variáveis como vc fez no inicio, adicione: OPTION (OPTIMIZE FOR(@DTINICIO ='2012-12-01', @DTFIM ='2012-12-30'))

    Verifique novamente o tempo levado para processar.

    at.

    Rafael



    segunda-feira, 10 de dezembro de 2012 18:40
  • nossa.... vlw cara... melhorou mto mais..... agora a consulta reduziu para 4 segundos...
    quarta-feira, 12 de dezembro de 2012 12:51
  • Boa tarde Pedro,

    Caso, tenha solucionado seu problema, marques a(s) respostas que te foram úteis, para que os demais usuários do forum possam se beneficar também, caso tenham dúvidas nesse mesmo assunto.

    At.
    Rafael

    quarta-feira, 12 de dezembro de 2012 16:38
  • Pedro,

    Vale ressaltar que o Optimizer For é uma das diversas Query Hint que podemos utilizer no SQL Server com objetivo de alterar o comportamento da Query em seu processo de preparação e não na execução.

    O optimizer for é responsável justamente por isso em tentar otimizar e forma de execução fazendo com que o query optimizer responsável em tentar melhorar a query.

    Quando estamos trabalhando com variáveis o comportamento do SQL Server é recompilar toda o plano de execução da query, com o Optimizer For este comportamento muda um pouco, onde toda definição de otimização é planejada levando-se em consideração o uso de variáveis declaradas locamente.

    Ou seja, ao invês de otimizar durante a execução da query o processo de otimização é realizado anteriormente.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quarta-feira, 12 de dezembro de 2012 17:01