Data de postagem: Jun 10, 2011 2:40:32 PM
No post sobre índices, publicado como parte 1 e parte 2, eu apresentei os índices do SQL Server e mostrei que o servidor escolhe uma forma diferente de acessar os dados para cada tipo de select que usamos.
Mas, como o SQL Server executa um comando (ou procedure)?
O processo de execução está dividido em quatro partes:
Parse - nessa fase o SQL Server verifica se há erros de sintaxe. Se tudo estiver OK, o comando ou procedure é transformado em uma estrutura capaz de ser lida pelo compilador;
Normalização - agora o SQL Server procura por inconsistências nos nomes de objetos ou colunas de tabelas e verifica se o comando faz sentido, por exemplo evitando que façamos coisas do tipo:
executar um select;
executar uma view;
deletar uma procedure;
Compilação - é o passo que gera o plano de execução, levando em conta a estrutura das tabelas, existência de índices ou não, se há views envolvidas. Finalmente, armazena o plano de execução criado no cache;
Otimização - cada comando que é executado consome disco, memória e processador. O SQL Server analisa esses consumos e usa o plano de execução que tem o MENOR CUSTO.
Para ilustrar como é o processo, criamos um database, uma tabela de produtos e a populamos usando o script abaixo:
CREATE DATABASE EXEMPLO_EXECUCAO
GO
USE EXEMPLO_EXECUCAO
–
CREATE TABLE PRODUTO
(
COD INT IDENTITY,
NOME VARCHAR(50),
TIPO VARCHAR(10)
)
–
INSERT INTO PRODUTO VALUES (‘ALIMENTO 1′, ‘ALIMENTO’)
–
DECLARE @X INT
SET @X = 1
WHILE @X <= 5000
BEGIN
INSERT INTO PRODUTO VALUES (‘FERRAMENTA ‘ + CONVERT(VARCHAR, @X), ‘FERRAMENTA’)
SET @X = @X + 1
END
–
INSERT INTO PRODUTO VALUES (‘ALIMENTO 2′, ‘ALIMENTO’)
Agora, criamos um índice do tipo non-clustered para a tabela, onde a chave é o campo TIPO:
CREATE NONCLUSTERED INDEX INDICE_PRODUTO_TIPO ON PRODUTO(TIPO)
Fazemos os seguintes selects e analisamos os planos de execução gerados (o comando DBCC abaixo é para esvaziar o cache de comandos):
DBCC FREEPROCCACHE
SELECT * FROM PRODUTO WHERE TIPO = ‘ALIMENTO’
SELECT * FROM PRODUTO WHERE TIPO = ‘FERRAMENTA’