Quais etapas devem ser necessárias para otimizar uma consulta com baixo desempenho?

StackOverflow https://stackoverflow.com/questions/61008

  •  09-06-2019
  •  | 
  •  

Pergunta

Sei que esta é uma questão ampla, mas herdei vários desempenhos ruins e preciso muito otimizá-los.Fiquei me perguntando quais são as etapas mais comuns envolvidas para otimizar.Então, que passos alguns de vocês tomam quando se deparam com a mesma situação?

Pergunta relacionada:
Quais técnicas genéricas podem ser aplicadas para otimizar consultas SQL?

Foi útil?

Solução

  1. Veja o plano de execução no analisador de consultas
  2. Veja qual etapa custa mais
  3. Otimize o passo!
  4. Retorne ao passo 1 [obrigado a Vinko]

Outras dicas

No SQL Server, você pode consultar o Plano de Consulta no Query Analyzer ou no Management Studio.Isso lhe dirá a porcentagem aproximada de tempo gasto em cada lote de declarações.Você vai querer procurar o seguinte:

  • Varreduras de mesa;isso significa que você está perdendo completamente os índices
  • Varreduras de índice;sua consulta pode não estar usando os índices corretos
  • A espessura das setas entre cada etapa de uma consulta informa quantas linhas estão sendo produzidas por aquela etapa. Setas muito grossas significam que você está processando muitas linhas e podem indicar que algumas junções precisam ser otimizadas.

Algumas outras dicas gerais:

  • Uma grande quantidade de instruções condicionais, como várias instruções if-else, pode fazer com que o SQL Server reconstrua constantemente o plano de consulta.Você pode verificar isso usando o Profiler.
  • Certifique-se de que consultas diferentes não estejam bloqueando umas às outras, como uma instrução update bloqueando uma instrução select.Isso pode ser evitado especificando a dica (nolock) nas instruções select do SQL Server.
  • Como outros mencionaram, experimente o assistente de ajuste de desempenho no Management Studio.

Por fim, eu recomendo fortemente a criação de um conjunto de testes de carga (usando o Visual Studio 2008 Test Edition), que você pode usar para simular o comportamento do seu aplicativo ao lidar com uma grande quantidade de solicitações.Alguns gargalos de desempenho do SQL só se manifestam nessas circunstâncias, e ser capaz de reproduzi-los facilita muito a correção.

Os índices podem ser um bom lugar para começar...

Os frutos mais fáceis de alcançar podem ser derrubados com o servidor SQL Índice Assistente de ajuste.

Não tenho certeza sobre outros bancos de dados, mas para SQL Server recomendo o Plano de Execução.Ele mostra claramente (embora com muita rolagem vertical e horizontal, a menos que você tenha um monitor de 400 "!) quais etapas da sua consulta estão consumindo tempo.

Se você tiver uma etapa que leva 80%, talvez um índice possa ser adicionado e, depois de ajustar o índice, execute novamente o Plano de Execução para encontrar sua próxima maior etapa.

Depois de alguns ajustes, você poderá descobrir que realmente não há etapas que se destaquem das outras, ou seja,eles são todos 1-2% cada.Se for esse o caso, talvez você precise ver se existe uma maneira de reduzir a quantidade de dados incluídos em sua consulta. Esses quatro milhões de pedidos de vendas fechados precisam ser incluídos na consulta "Pedidos de vendas ativos" ?Não, então exclua todos aqueles com STATUS='C' ...ou algo assim.

Outra melhoria que você verá no Plano de Execução são as pesquisas de marcadores, basicamente ele encontra uma correspondência no índice, mas o SQL Server precisa vasculhar rapidamente a tabela para encontrar o registro desejado.Às vezes, essa operação pode demorar mais do que apenas digitalizar a tabela. Se for esse o caso, você realmente precisa desse índice?

Com índices, e especialmente com SQL Server 2005 você deve olhar para a cláusula INCLUDE, isso basicamente permite que você tenha uma coluna em um índice sem realmente estar no índice, então se todos os dados que você precisa para sua consulta estiverem em seu índice ou é uma coluna incluída, então o SQL Server não precisa nem olhar para a tabela, um grande aumento de desempenho.

Há algumas coisas que você pode observar para otimizar o desempenho da sua consulta.

  1. Certifique-se de ter o mínimo de dados.Certifique-se de selecionar apenas as colunas necessárias.Reduza os tamanhos dos campos ao mínimo.

  2. Considere desnormalizar seu banco de dados para reduzir junções

  3. Evite loops (ou seja,buscar cursores), atenha-se às operações definidas.

  4. Implemente a consulta como um procedimento armazenado, pois é pré-compilado e será executado mais rapidamente.

  5. Certifique-se de ter os índices corretos configurados.Se o seu banco de dados for usado principalmente para pesquisa, considere mais índices.

  6. Use o plano de execução para ver como o processamento é feito.O que você deseja evitar é uma varredura de tabela, pois isso é caro.

  7. Certifique-se de que as estatísticas automáticas estejam ativadas.SQL precisa disso para ajudar a decidir a execução ideal.Veja a ótima postagem de Mike Gunderloy para mais informações. Noções básicas de estatística no SQL Server 2005

  8. Certifique-se de que seus índices não estejam fragmentados Reduzindo a fragmentação do índice do SQL Server

  9. Certifique-se de que suas tabelas não estejam fragmentadas. Como detectar fragmentação de tabela no SQL Server 2000 e 2005

O plano de execução é um ótimo começo e ajudará você a descobrir qual parte da sua consulta você precisa resolver.

Depois de descobrir onde, é hora de abordar como e por quê.Dê uma olhada no tipo de consultas que você está tentando realizar.Evite loops a todo custo, pois são lentos.Evite cursores a todo custo porque eles são lentos.Atenha-se a consultas baseadas em conjuntos sempre que possível.

Existem maneiras de fornecer dicas de SQL sobre o tipo de junções a serem usadas se você estiver usando junções.Porém, tenha cuidado aqui, embora uma dica possa acelerar sua consulta uma vez, ela pode retardá-la em 10 vezes na próxima vez, dependendo dos dados e parâmetros.

Finalmente, certifique-se de que seu banco de dados esteja bem indexado.Um bom lugar para começar é qualquer campo contido em uma cláusula where que provavelmente deveria ter um índice.

Observe os índices nas tabelas que fazem a consulta.Podem ser necessários índices em campos específicos que participam da cláusula where.Observe também os campos usados ​​nas junções da consulta (se existirem junções).Se já existirem índices, observe o tipo de índice.

Se isso falhar (porque há pontos negativos no uso de dicas de bloqueio), observe as dicas de bloqueio e nomeie explicitamente o índice a ser usado na junção.Usar NOLOCKS é mais óbvio se você estiver recebendo muitas transações travadas.

Faça o que Roman e Andy S mencionaram primeiro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top