Quiz – Porque o SQL não utiliza meu indice?
Recentemente vi uma pergunta bem interessante, e vou publicar aqui também, pode ser que você já tenha visto, portanto se esse for o caso não estrague a brincadeira com a solução nos comentários ok? J Valeu.
Vamos lá, vou colocar um script e fazer uma pergunta e o leitor que conseguir me dar a melhor resposta ganhará um.. ummm….. super parabéns….
Eu irei analisar as respostas e publicar o nome do Leitor aqui no Blog, ao responder envie um e-mail para mim no fabiano_amorim( at )bol.com.br com o maior número de detalhes que você puder levantar em relação a questão abaixo.
Vamos lá,
O problema é o seguinte, eu tenho um índice em uma tabela e o SQL não o utiliza, porém se eu trocar a coluna do índice e colocar na clausula INCLUDE ele passa a usar o índice, o que eu quero saber é o porque deste comportamento.
USE TEMPDB
GO
DROP TABLE TABTeste
CREATE TABLE TabTeste(ID Int Identity(1,1) Primary Key,
Nome1 VarChar(4) NOT NULL,
Valor1 Int NOT NULL)
GO
DECLARE @i INT
SET @i = 0
WHILE (@i < 1000)
BEGIN
INSERT INTO TabTeste(Nome1, Valor1)
VALUES(‘aaaa’, 0)
SET @i = @i + 1
END;
GO
Na consulta abaixo o SQL tem todos os valores da consulta no índice, já que a coluna ID é o índice cluster, portanto ele faz parte do índice nonclustered.
Então porque o SQL não utiliza o índice por Nome1 e Valor1? Neste caso o SQL não deveria utilizar o índice?
CREATE NONCLUSTERED INDEX ix_TesteSem_Include ON TabTeste(Nome1, Valor1)
GO
SELECT ID
FROM TabTeste
WHERE Nome1 = ‘aaaa’
AND Valor1 <= 10
ORDER BY ID
Se eu recriar o índice, mas desta vez incluindo a coluna Valor1 como INCLUDE ele passa a utilizar o índice, porque?
CREATE NONCLUSTERED INDEX ix_Teste_Include ON TabTeste(Nome1) INCLUDE(Valor1)
GO
SELECT ID
FROM TabTeste
WHERE Nome1 = ‘aaaa’
AND Valor1 <= 10
ORDER BY ID
Muito boa pergunta eim!
Relembrando respondam no meu e-mail, em breve estarei publicando a resposta…