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
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.
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!
Wesley Mota
Latest posts by Wesley Mota (see all)
- Free Blackjack No Download: Appreciate Blackjack Anytime, Anywhere - novembro 25, 2024