Índices, quem são, como usá-los?

Fala aee pessoal!!

Bom, antes de começar a falar de índices, vamos primeiramente usar a imaginação e fabricar um cenário.

Vamos imaginar um LIVRO (evidente que este livro é sobre o SQL Server S2) com aproximadamente 1500 páginas. (Sabemos que os livros usam ÍNDICES para nos orientar na busca de determinado recurso/conteúdo).

Agora vamos arrancar o índice desse livro, e vamos procurar neste livro o conteúdo sobre “COMO EXECUTAR SELECT”. Neste cenário infelizmente teremos que analisar TODAS as 1500 páginas do livro, palavra a palavra, conteúdo a conteúdo, e anotar ou guardar de alguma forma todo o conteúdo que nos possa parecer familiar com o assunto. Podemos perceber o quão doloroso e árduo seria nosso trabalho sem o bendito Índice do nosso livro.

Vamos sair da imaginação e criar este cenário?


Vamos praticar!

Criaremos uma base para nosso cenário chamada “Estudos”.

CREATE DATABASE Estudos

Em seguida criaremos uma tabela chamada Tabela.

use Estudos

CREATE TABLE Tabela ( 
	Col1 int,
	Col2 varchar(100)
)

Podemos perceber que essa tabela NÃO POSSUI uma PK nem índices (Obs.: Ao criar uma PK(Primary key), um índice CLUSTERED será criado).

Uma tabela sem índice é conhecida como tabela HEAP.

Agora vamos “popular” nossa tabela:

DECLARE @CONTADOR int = 1

BEGIN
    WHILE @CONTADOR <= 1500000
    BEGIN
        INSERT INTO Tabela(Col1, Col2)
		VALUES(
			@CONTADOR, CONCAT('CONTEUDO ' , @CONTADOR)
		)
       SET @CONTADOR = @CONTADOR + 1;
     
    END;
END;

Alerta!! Script com grande tendência de demora na execução!

Apenas para acompanharmos a atuação do índice, deixamos a tabela com 1,5 milhão de registros.

Observação: Poderíamos criar uma tabela com uma coluna IDENTITY, e com isso evitaríamos o WHILE, (quantas vezes já usamos o WHILE no SQL Server?) fica uma dica bônus.

Agora vamos para o teste!

Basicamente temos uma tabela com 1,5 milhão de registros e precisamos encontrar o valor da col1 = 998. Como temos uma tabela HEAP, a pesquisa passa por TODOS os registros para verificar se aquele registro é o 998:

(1) Oi, você é 998?

(2) Oi, você é 998?

(3) Oi, você é 998?

(n)… (1,5 milhão de vezes!!!)

Exatamente isso, o SQL Server faz essa pergunta em todos os registros!

Vamos executar um SELECT para buscarmos o valor 998:

SELECT * 
FROM Tabela
WHERE col1 = 998

Dica!!! ^^

Cuidado com esse “*” aí hein, vamos usá-lo com parcimônia, vamos conversar sobre isso em outro post.

Para executar essa query, o SQL Server precisou fazer 6272 logical reads!

“Mas Ithalo, de onde você tirou esse número de Logical Reads ai???”

Antes de executar a query, execute o comando “SET STATISTICS IO ON”. Quando fazemos isso o SQL Server vai exibir informações referentes à quantidade de leituras de páginas que a query fez. Aconselho uma lida nesse post no blog do Dirceu. https://www.dirceuresende.com/blog/os-comandos-set-do-sql-server.

Bom, vamos agora criar nosso índice, executar a query novamente e comparar o desempenho:

CREATE CLUSTERED INDEX IX_Tabela 
ON Tabela (Col1);   
GO 
  • ANTES -> 6272 logical reads
  • DEPOIS -> 3 logical reads!!!

Isso mesmo, após a criação do índice fizemos APENAS 3 logical reads!

“Por que isso acontece Ithalo? Que bruxaria é essa cara???”

Para responder a esta pergunta, vamos primeiro entender o que é índice.

Quando pesquisamos pelo registro 998 o SQL Server não sabe onde procurar e, portanto, ele sai perguntando registro a registro, consequentemente essa pesquisa se torna lenta e custosa.

Quando criamos o índice, estamos criando um objeto em uma estrutura na forma de árvore ordenada pela coluna que criamos no índice, ou seja, estamos apontando exatamente onde está o registro que estamos pesquisando, e essa é a mágica.

Para mais conhecimento sobre este assunto, recomendo fortemente que vejam este vídeo do Fabricio. https://www.youtube.com/watch?v=lPwjhtHEfw0&t=638s

Bom galera, muito obrigado à todos que tiveram paciência de ler até aqui, espero ter ajudado em alguma coisa. No próximo post vamos falar um pouco sobre índices clustered e nonclustered, e se devemos sempre criar índices.

Um agradecimento especial ao Luiz, https://luizlima.net/ que foi fundamental para este post.

Um abraço!

2 comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *