No SQL Server, TABLE SCAN ocorre quando o mecanismo de banco de dados precisa percorrer todas as linhas de uma tabela para encontrar os dados desejados, em vez de usar um índice para localizar rapidamente as informações.
đ Por que ocorre um TABLE SCAN?
Um TABLE SCAN acontece quando:
- Não há um índice adequado na coluna usada na cláusula WHERE.
- O índice existente não é eficiente para a consulta.
- A consulta retorna um grande número de registros, tornando o uso do índice menos vantajoso.
- Funções são aplicadas à coluna na cláusula WHERE, impedindo o uso do índice.
- O SQL Server entende que a leitura sequencial é mais rápida do que usar um índice (por exemplo, em tabelas pequenas).
â Impacto na Performance
- Em tabelas pequenas, o impacto pode ser mínimo.
- Em tabelas grandes, pode causar alto uso de CPU e I/O, tornando as consultas lentas.
đ Como Identificar um TABLE SCAN?
Para verificar se uma consulta está realizando um TABLE SCAN, utilize o plano de execução:
SET STATISTICS IO ON;
GO
SELECT
*
FROM
Clientes
WHERE
Nome = 'Carlos';
GO
SET STATISTICS IO OFF;
Ou visualize o plano de execução gráfico no SQL Server Management Studio (SSMS):
SELECT *
FROM
Clientes
WHERE
Nome = 'Carlos';
Depois, ative "Incluir Plano de Execução Estimado" ou "Incluir Plano de Execução Real".
đ Como Evitar TABLE SCAN?
Criar um índice apropriado para as consultas mais frequentes:
CREATE NONCLUSTERED INDEX idx_nome_cliente ON Clientes (Nome);
Evitar funções na cláusula WHERE:
â WHERE UPPER(Nome) = 'CARLOS' → Evita uso de índice
â
WHERE Nome = 'Carlos' → Permite uso de índice
Usar colunas indexadas corretamente nos filtros e JOINs.
Se uma consulta envolve um WHERE ou um JOIN, é essencial que as colunas utilizadas nessas operações possuam índices apropriados. Caso contrário, o SQL Server pode realizar um TABLE SCAN, impactando o desempenho.
â Exemplo de Problema: JOIN sem Índice
Considere duas tabelas:
Clientes (ClienteID, Nome, Email) → 1 milhão de registros
Pedidos (PedidoID, ClienteID, ValorTotal) → 10 milhões de registros
â Consulta sem Índice na Coluna de Junção
SELECT
c.Nome,
p.ValorTotal
FROM
Clientes c
JOIN Pedidos p
ON c.ClienteID = p.ClienteID
WHERE
c.Nome = 'Carlos';
đ Problema:
Se ClienteID na tabela Pedidos não tiver um índice, o SQL Server fará um TABLE SCAN na tabela Pedidos, percorrendo todos os 10 milhões de registros para encontrar os correspondentes na Clientes.
đ Solução: Criando um Índice Apropriado
â
Criando um Índice na Coluna ClienteID de Pedidos
CREATE INDEX idx_pedidos_clienteid ON Pedidos (ClienteID);
Agora, ao executar a mesma consulta, o SQL Server poderá usar o índice para localizar rapidamente os registros da Pedidos, evitando um TABLE SCAN.
đ Verificando se o Índice está sendo Usado
Depois de criar o índice, você pode ativar o Plano de Execução para verificar se ele está sendo utilizado:
SET STATISTICS IO ON;
GO
SELECT
c.Nome, p.ValorTotal
FROM
Clientes c
JOIN Pedidos p
ON c.ClienteID = p.ClienteID
WHERE c.Nome = 'Carlos';
GO
SET STATISTICS IO OFF;
Se o índice estiver sendo usado corretamente, o plano de execução não mostrará um TABLE SCAN, e sim um INDEX SEEK.
Reavaliar índices existentes usando:
SELECT
*
FROM
sys.dm_db_missing_index_details;
đŻ Resumo
- Sempre crie índices nas colunas utilizadas em JOINs.
- Verifique o plano de execução para confirmar que os índices estão sendo utilizados.
- Evite filtrar colunas sem índice, pois isso pode forçar um TABLE SCAN.