Inicial > SQL Server > Quiz – Porque o SQL não utiliza meu indice?

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

clip_image002

 

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

clip_image004

 

Muito boa pergunta eim!

Relembrando respondam no meu e-mail, em breve estarei publicando a resposta…

Categorias:SQL Server
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

%d blogueiros gostam disto: