Índice Não Agrupado

Propaganda
Encontro SQL BH
May 2016
Desmistificando Índices com SQL Server
Apoio
Local Chapters
5
Upcoming SQL Saturdays
Brazil
• Jun 18
Rio de Janeiro #512
Visit www.sqlsaturday.com to
register for an event near you!
Agenda
•
•
•
•
•
7
Conceitos Fundamentais
Estatísticas
Índice agrupado
Índice não agrupado
Índices Filtrados
Conceitos Fundamentais
8
Como o SQL acessa dados?
• Table Scan
• Índice
9
Table Scan
BOM PASSEIO!!!
1
0
Com Índice
1
1
Estrutura dos Índices
• Normalmente baseado em estruturas de árvore
• O nó mais alto é o raiz e o mais baixo os
chamados nós folha
Página Índice
Raiz
Nós
Nós Folhas
Tabela
1
2
Páginas Índices
Diferentes tipos de dados e índices
• Números
• Pequenos e por isso rápidos para navegar.
• Se incremental, melhor ainda.
• Textos
• Contrário dos números
• Datas
• Só perdem para os números. Ótimos para ordenar e obter
intervalos.
• GUID
• Alguns dizem ser grande. Mas não é! Somente 16 bytes e pode
ser comparado de maneira binária. Portanto muito rápido.
• BIT
• Equivocadamente dizem que não deve ser indexado
1
3
Seletividade, densidade
• Seletividade
• Quantas linhas serão retornadas em uma pesquisa,
comparado ao total de linhas que existem
• Alta seletividade significa retornar um pequeno
conjunto de linhas dentro do universo de dados
• Número de Valores Exclusivos / Número Total de
Registros
CPF X SEXO
1
4
Seletividade, densidade
• Densidade
• Na física – Massa / Volume
• Oposto a seletividade. Quando mais denso, menos
seletivo normalmente, devido ao grande número de
repetições.
“MAIS DO MESMO”
1
5
Porque falar sobre isso?
• Chave primária é normalmente o índice mais
seletivo
• Indexar colunas de baixa seletividade não vale a
pena
• Lembrar que índices secundários são um ponteiro
para o índice primário. Alta densidade significa
centenas ou milhares de ponteiros para o
primário.
• Escolha da ordem das colunas em um índice
composto
• Otimizador de consultas faz uso destas
estatísticas para escolher como criar os planos de
execução
1
6
Quiz
Você é DBA na sua empresa e o gerente de Recursos
Humanos pediu a você que otimizasse a consulta de
empregados para que ficasse o mais rápida possível.
Qual coluna da tabela você usaria para filtrar rapidamente
um empregado?
1. Sobrenome
2. O GUID
3. A data de admissão
4. A idade
5. O departamento
1
7
Primeiro Mito
Índice deixa minhas alterações lentas?
1
8
Estatísticas
19
Estatísticas
Criadas automaticamente com os índices
Composto internamente de 03 partes:
1. Cabeçalho
2. Vetor de Densidade
3. Histograma
DBCC show_statistics(‘nome da tabela ou view’, ‘nome da estatística’);
2
0
Estatísticas
2
1
Estatísticas - Histograma
•
•
•
•
2
2
Retrata a distribuição de valores da coluna
Mede a frequência de valores exclusivos
Em resumo: calcula a Densidade / Seletividade
Traz os passos usados para criar as estatísticas
Estatísticas - Cabeçalho
Traz data e hora da última atualização
Número total de linhas na ocasião
Número de Passos no histograma (Máximo 200)
Informa se é uma estatística agrupada para
consultas de caracteres (char, varchar, etc)
• Se for um índice filtrado, traz a expressão do
filtro
•
•
•
•
2
3
DEMO
2
4
Índice Simples
• Índice simples é aquele composto por uma única
coluna.
• Útil quase sempre em colunas de alta seletividade
2
5
Índice Composto
• Índice composto é aquele formado por várias
colunas
• Muito útil em consultas FREQUENTES de alta
seletividade alcançada apenas em múltiplas colunas
• Índice composto pelas colunas A, B não é igual ao
índice formado pelas colunas B,A
• Geralmente a boa prática nos diz para usar a coluna
mais seletiva primeiro
2
6
Segundo Mito
A ordem das colunas nos índices é
indiferente?
2
7
Índice Agrupado
28
Índice Agrupado
• Páginas de dados da tabela são armazenados
em uma sequência lógica
• As linhas são armazenados em uma sequência
lógica junto com as páginas de dados
• Possível apenas um índice agrupado por tabela
2
9
Índice Agrupado - Criação
• Automaticamente ao especificar uma chave
CREATE TABLE dbo.Article
primária
( ArticleID int IDENTITY(1,1) PRIMARY KEY,
• Manualmente, ArticleName nvarchar(50) NOT NULL,
PublicationDate date NOT NULL
caso não exista );
CREATE TABLE dbo.LogData
( LogID int IDENTITY(1,1),
LogData xml NOT NULL
);
ALTER TABLE dbo.LogData
ADD CONSTRAINT PK_LogData
PRIMARY KEY (LogId);
CREATE CLUSTERED INDEX CL_LogTime
ON dbo.LogTime(LogTimeID);
3
0
Terceiro Mito
Se eu usar a coluna CPF como índice
agrupado, terei lentidão na atualização de
dados?
3
1
Incorporando espaço livre nos índices
Pode resolver os problemas causados na alteração
de dados
• FILLFACTOR
• PAD_INDEX (Aplica FILLFACTOR nas páginas
intermediárias do índice
3
2
Índice agrupado eficiente
•
•
•
•
3
3
Pequeno
Estático
Crescente
Exclusivo
Índice agrupado – Tipos de Dados
Adequados
Tipo
Comentários
int
Bom candidato principalmente se IDENTITY
bigint
Bom candidato principalmente se IDENTITY
uniqueidentifier
Alguns possíveis problemas com tamanho
varchar
Problemas com tamanho, performance para
ordenar e com o fato de normalmente não ser
estático.
date
Problemas por não ser exclusive, mas excelente
para consultas de faixas
smalldatetime
Problemas com exclusividade
3
4
Índice Não Agrupado
35
Índice não agrupado
• A página folha aponta para um índice
agrupado normalmente
• Pode melhorar performance em colunas
adicionais e muito utilizadas em consultas
• O impacto causado pela modificação de
dados deve ser levado em conta
3
6
Índice não agrupado - Funcionamento
Página Raiz
Páginas do Ìndice
Nós Folha
Contém a chave
Chave agrupada
id
index_id=1
root_page
Páginas contém dados
Índice agrupado
3
7
Página Raiz
Cláusula Include
Colunas especificadas são adicionadas nos nós folha do índice não
agrupado
As colunas base, são ordenadas, as colunas incluídas não
Não entra no limite de tamanho dos índices (16 colunas / 900 bytes)
Evita a busca dos dados no índice agrupado
Inclua TODAS as colunas que vai usar na sua consulta, senão perde o
sentido
SELECT EmployeeID, DepartmentID, LastName
FROM Employee
WHERE DepartmentID = 5
CREATE NONCLUSTERED INDEX NC_EmpDep
ON Employee(EmployeeID, DepartmentID)
INCLUDE (Lastname)
3
8
Índices Filtrados
39
Índices Filtrados
Melhor desempenho das consultas
Redução do custo de manutenção do índice
Redução do custo de armazenamento
Muito útil em colunas com alto índice de
nulabilidade
• Muito útil em colunas de alta densidade mas em
consultas a valores de alta seletividade
•
•
•
•
4
0
Volunteering Opportunities
PASS would not exist without its global network of
passionate, dedicated, and hardworking volunteers.
Volunteer today!
For local opportunities, please visit:
volunteer.sqlpass.org
For PASS HQ related activities, please update the
“MyVolunteering” section of your MyPASS profile.
4
1
Stay Involved!
•
Sign up for a free membership today at sqlpass.org.
•
•
•
•
Linked In:
Facebook:
Twitter:
PASS:
http://www.sqlpass.org/linkedin
http://www.sqlpass.org/facebook
@SQLPASS
http://www.sqlpass.org
Daniel Silveira
[email protected]
daniel.silveira.182
dansil2002
www.danielsilveira.com.br
dansil2002
43
OBRIGADO!!!!
44
Download