Skip to content

yanfurlan/sqlserver-query-optimization

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 

Repository files navigation

Otimização de Queries no SQL Server

Introdução

A otimização de queries é essencial para garantir alto desempenho no SQL Server, reduzindo tempo de execução e uso de recursos. Este guia aborda estratégias avançadas para melhorar a eficiência das consultas.


1. Planos de Execução

O SQL Server usa o otimizador de consultas para gerar planos de execução eficientes. Para analisá-los, utilize:

SET STATISTICS IO ON;
SET STATISTICS TIME ON;
EXPLAIN PLAN FOR SELECT * FROM tabela WHERE coluna = 'valor';

Como interpretar um plano de execução?

  • Clustered Index Seek: Melhor opção, indica busca eficiente por índices clusterizados.
  • Index Scan: Indica leitura completa de um índice. Pode ser otimizado.
  • Table Scan: Indica que um índice pode ser necessário.
  • Nested Loops vs. Hash Join: Nested Loops é melhor para pequenos conjuntos de dados, Hash Join para grandes.

Exibindo o plano de execução no SQL Server

Para exibir o plano de execução graficamente no SQL Server Management Studio (SSMS), use os comandos:

  • Plano de execução estimado (antes de rodar a query):
SET SHOWPLAN_XML ON;
GO
SELECT * FROM tabela WHERE coluna = 'valor';
GO
SET SHOWPLAN_XML OFF;
  • Plano de execução real (após execução da query):
SET STATISTICS PROFILE ON;
SELECT * FROM tabela WHERE coluna = 'valor';
SET STATISTICS PROFILE OFF;

Além disso, o SQL Server Management Studio (SSMS) permite visualizar graficamente o plano de execução ativando a opção "Include Actual Execution Plan" antes de executar a consulta.


2. Uso de Índices

Os índices podem melhorar drasticamente a performance.

Tipos de índices

  • Clustered Index: Mantém os dados ordenados, um por tabela.
  • Non-clustered Index: Cria uma estrutura separada para acesso rápido.
  • Filtered Index: Melhora consultas seletivas com um subconjunto de dados.
  • Columnstore Index: Excelente para OLAP e análises.

Criando um índice eficiente

CREATE NONCLUSTERED INDEX idx_coluna ON tabela (coluna);

Evite:

  • Muitos índices desnecessários.
  • Índices em colunas com baixa seletividade.

3. Estatísticas e Atualização Automática

O otimizador depende de estatísticas atualizadas para estimar o número de linhas afetadas.

Verificando estatísticas

DBCC SHOW_STATISTICS ('tabela', 'indice');

Atualizando estatísticas manualmente

UPDATE STATISTICS tabela;

Ative Auto Update Statistics para evitar problemas:

ALTER DATABASE database_name SET AUTO_UPDATE_STATISTICS ON;

4. Gerenciamento de Paralelismo

O SQL Server pode dividir execução de queries entre vários núcleos.

Controlando o grau de paralelismo (MAXDOP)

OPTION (MAXDOP 4);

Use MAXDOP 1 para workloads OLTP e evite bloqueios.


5. Uso de Hints

Os hints ajudam a guiar o otimizador de consultas.

Query Hints

  • FORCESEEK: Força o uso de índices.
  • LOOP JOIN: Força uso de Nested Loops.
  • HASH JOIN: Força uso de Hash Join.
  • MERGE JOIN: Para grandes volumes de dados ordenados.
SELECT * FROM tabela WITH (FORCESEEK) WHERE coluna = 'valor';

Table Hints

  • NOLOCK: Evita bloqueios de leitura, mas pode gerar resultados inconsistentes.
SELECT * FROM tabela WITH (NOLOCK);

6. Query Tuning Dinâmico

Utilize Query Store para analisar queries de alto custo.

Habilitar Query Store

ALTER DATABASE database_name SET QUERY_STORE = ON;

Consultando queries problemáticas

SELECT TOP 10 query_id, total_execution_time FROM sys.query_store_runtime_stats ORDER BY total_execution_time DESC;

Conclusão

A otimização de queries no SQL Server exige compreensão de planos de execução, índices, estatísticas e paralelismo. Implementar boas práticas reduz latência e melhora a performance do banco de dados.

Referências


Caso tenha sugestões ou precise de ajustes, contribua com Pull Requests no GitHub!

About

Otimização de Queries no SQL Server

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published