Usuário com melhor resposta
Como melhorar estas querys?

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
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
- Editado Rafael S. Melo segunda-feira, 10 de dezembro de 2012 18:42
- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 12 de dezembro de 2012 17:04
- Marcado como Resposta Ricardo Russo quarta-feira, 9 de janeiro de 2013 12:12
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
-
-
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]
-
-
-
-
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 -
-
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
- Editado Rafael S. Melo segunda-feira, 10 de dezembro de 2012 18:42
- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 12 de dezembro de 2012 17:04
- Marcado como Resposta Ricardo Russo quarta-feira, 9 de janeiro de 2013 12:12
-
-
-
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]