SQL Server Performance

Consulta SQL: Otimize a Pesquisa de Chave Com Colunas de Inclusão

Otimize a Pesquisa de Chave Com Colunas de Inclusão

Em uma das recentes verificações completas de integridade dos desemprenho do banco de dados, meu cliente teve um cenário muito interessante em que suas consultas estavam sendo executadas rapidamente, mas gradualmente começaram a ficar lentas e, eventualmente, passaram a demorar 10 minutos para serem executadas. Então eles me procuraram para ajustar sua consulta SQL lenta.

Ao olhar para o plano de execução da consulta SQL, há uma grande operação de pesquisa de chave que estava realmente desacelerando sua consulta. Por isso, decidi criar um índice com coluna include nessa tabela e resolver esse problema.

Vamos ver como resolver esse problema no mundo real.

1. Vamos criar uma tabela de teste na consulta SQL

USE TempDB
GO
-- Criando Tabela de Exemplo
CREATE TABLE TabelaDeTeste (ID INT, Nome VARCHAR(100), Sobrenome VARCHAR(100))
GO

Em seguida, preencha a tabela de teste com dados de amostra.

-- Inserindo Dados
INSERT INTO TabelaDeTeste (ID, Nome, Sobrenome)
VALUES(1,'Wesley', 'Mota')
GO
INSERT INTO TabelaDeTeste (ID, Nome, Sobrenome)
VALUES(1,'Wesley', 'Santana')
GO 10000

Logo após, crie um índice clusterizado e um índice não clusterizado na tabela.

-- Índice Clusterizado na Coluna ID
CREATE CLUSTERED INDEX IDX_TabelaDeTeste_ID ON TabelaDeTeste (ID)
GO
-- Índice não clusterizado na coluna Nome
CREATE NONCLUSTERED INDEX IDXTabelaDeTeste_Nome ON TabelaDeTeste (Nome)
GO

Logo em seguida, execute nossa consulta SQL com a ativação do plano de execução real. Você pode ativar o plano de execução real entrando na barra de ferramentas do SSMS >> Consulta SQL >> e “Incluir Plano de Execução Real”.  Alternativamente, você também pode habilitar isso pressionando CTRL + M.

SELECT Nome, Sobrenome
FROM TabelaDeTeste 
WHERE Nome = 'Wesley'
GO

Agora você está pronto para executar a consulta. Logo após executar a consulta, abra o plano de execução.

2. Abrindo o plano de execução

Indice Include SQL Server

No plano de execução, você notará que há uma pesquisa de chave além do uso do índice. O SQL Server tem que fazer a pesquisa de chave quando o índice não tem todas as colunas necessárias que a consulta está solicitando.

CREATE NONCLUSTERED INDEX IDXTabelaDeTeste_FirstName_Include ON TabelaDeTeste (Nome)
INCLUDE(Sobrenome)
GO

Nesse caso, você tem duas opções:

  • Primeiramente, altere o índice original e inclua as colunas visíveis na Lista de saída.
  • Em seguida, crie um novo índice incluindo as colunas da lista de saída na parte de inclusão do índice.

Para deixar mais prático, vou criar um novo índice em nosso exemplo. Portanto, lembre-se de criar muitos índices na tabela para retardar as operações de DML.

Logo após criar o índice, vamos executar a mesma consulta novamente e verificar o plano de execução.

Sem Key Lookup SQL Server

Você pode ver no plano de execução que não há mais pesquisa de chave e a consulta também usa nosso índice recém-criado.

Aqui está o script para limpar o objeto que criamos.

DROP Table TabelaDeTeste
GO

Existem muitos truques semelhantes para ajustar sua consulta SQL. Se acaso você precisar de ajuda para ajustar sua consulta lenta, entre em contato!

Consulta SQL: Otimize a Pesquisa de Chave Com Colunas de Inclusão
The following two tabs change content below.

Wesley Mota

DBA SQL Server
Profissional graduado em Banco de Dados e Sistemas de Informação com mais de 7 anos de experiência em empresas de software. Certificado MCSA Microsoft SQL Server possui intensa vivência em administração de banco de dados, Tunning, Performance SQL Server, levantamento de melhorias e monitoramento de banco de dados e servidores SQL Server. Consultoria SQL Server em diversos clientes no Brasil e ao redor do mundo. Escritor no blog dbasqlserverbr.com.br/blog. Onde compartilha conhecimento, experiências e dicas de performance para DBAs SQL Server. Conhecimentos em Oracle e ambientes de alta disponibilidade. Desenvolvimento de softwares web e mobile.Gerenciamento de equipe e projetos.

Latest posts by Wesley Mota (see all)