Exercício com Gabarito
Defina no máximo 10 índices para as tabelas abaixo (tipo, atributos, justificativa). Considere
as estatísticas e principais consultas apresentadas a seguir. O contexto é de alimentação
servida em voos em todo o mundo.
Tabelas:
(R) Refeição (cod-ref, nome-ref, cia-aérea, culinária)
(T) Tem (cod-ref, cod-ing, quantidade)
(I) Ingrediente (cod-ing, nome-ing, perecível, unidade)
(P) Preparo (cod-ref, etapa, descrição, duração)
Estatísticas:
10.000 refeições, 2.000 ingredientes, 222 companhias aéreas
Em média uma refeição tem 9 ingredientes e 6 etapas de preparo
R.culinária = Brasileira (1%), Internacional (73%), Chinesa (21%), Vegetariana (5%)
I.perecível = Não (20%), Sim (80%)
Cardinalidade (R.nome-ref) ≈ Cardinalidade (R.cod-ref)
Cardinalidade (I.nome-ing) ≈ Cardinalidade (I.cod-ing)
Principais Consultas:
1. SELECT nome-ref FROM R WHERE cia-aérea = “Mistral” AND cor-ref IN (SELECT cod-ref
FROM T WHERE cod-ing IN (SELECT cod-ing FROM I WHERE perecível = “Não”))
2. SELECT cod-ref, nome-ref, cia-aérea FROM R WHERE cod-ref NOT IN (SELECT cod-ref
from P)
3. SELECT cod-ing, nome-ing FROM I, R, T, P WHERE I.cod-ing = T.cod-ing AND T.cod-ref
= R.cod-ref AND R.cod-ref = P.cod-ref AND cia-aérea = “Minuano” AND culinária =
“Vegetariana” AND perecível = “Sim” AND unidade = “gramas” AND quantidade > 200
AND duração > 10
4. SELECT nome-ref FROM R, P WHERE R.cod-ref = P.cod-ref AND descrição LIKE
‘%fritar%’
p.1
A decisão de usar índices, e eventual escolha do tipo de índice, para cada atributo de uma tabela,
deve levar em consideração (1) a sua utilização e (2) a sua cardinalidade na tabela, que podem ser
observadas nas estatísticas fornecidas.
Uma heurística é que chaves primárias precisam de índices e chaves secundárias também, para
otimizar a junção entre tabelas. Outra é que valores normalmente não são indexados, a não ser que
sejam codificados (ex: faixas de salários, A = 100 a 1.000, etc).
Nos exercícios, testes e provas eu sempre apresentarei, junto com as tabelas, um conjunto de
“principais consultas”. Elas serviram de referência para o projeto de índices. Na prática, a
recomendação é que se busque identificar as transações típicas que utilizam o conjunto de tabelas
alvo do projeto de índices.
Os 3 tipos de índices que apresentei em sala têm vantagens e limitações, que descrevo brevemente
a seguir:
•
Árvore B+ é o “coringa” dos índices, mas nem sempre a melhor escolha. Pode ser usado
para comparações (busca) por igualdade, diferença, maior, menor. Pode ter algumas chaves
repetidas. Não é tão rápido/eficiente quanto o Hashing quando a busca é apenas por
igualdade (o Hashing faz mais contas e menos acessos a disco que a Árvore B+ para
descobrir o endereço físico de uma tupla). Não é tão eficiente quanto o Bitmap no caso do
atributo possuir baixa cardinalidade em comparação com a cardinalidade da tabela
(ex:atributos cores de produtos, 5 cores distintas, 10.000 produtos).
•
Hashing só serve para buscas por igualdade e com atributos com cardinalidade próxima à
cardinalidade da tabela. Um bom exemplo são as chaves primárias e candidatas. Quanto
mais a cardinalidade do atributo for próxima a da tabela, menos colisões haverá no
processamento destes atributos. É melhor que a árvore B+ quando pode ser aplicado (veja
acima).
•
Bitmap ideal para buscas que comparam com “E”, “OU” ou “NÃO” (operadores lógicos)
vários atributos com índices bitmap, pois eles podem ser “logicamente” combinados, mas
também funciona de forma eficiente para buscar por igualdade. Não é adequado caso a
cardinalidade do atributo seja próxima à cardinalidade da tabela (os bitmaps teriam quase
todos os seus bits zerados e uns poucos bits ligados, muito espaço ocupado, baixa
eficiência). É melhor que a árvore B+ quando pode ser aplicado (veja acima).
p.2
Tipo
Atributos
Justificativa
1
Hashing ou
Árvore B+
R.cod-ref
É chave primária, há apenas comparações por igualdade
2
Bitmap
R.cia-aérea
Apenas busca por igualdade (consultas 1 e 3), baixa
cardinalidade relativa (222 em 10.000 refeições)
3
Bitmap
R.culinária
Apenas busca por igualdade (consulta 3), baixíssima
cardinalidade relativa (4 em 10.000 refeições)
4
Árvore B+
T.cod-ref
Comparações por igualdade para junção porém há valores
repetidos na tabela T
5
Árvore B+
T.cod-ing
Comparações por igualdade para junção porém há valores
repetidos na tabela T
6
Hashing ou
Árvore B+
I.cod-ing
É chave primária, há apenas comparações por igualdade
7
Bitmap ou
nada
I.perecível
A cardinalidade relativa é muito baixa (2 em 2000) mas no
caso do valor = “Sim” (consulta 3) é provável que o índice
não seja útil (baixa seletividade, 80%).
8
Bitmap
I.unidade
Não há estatísticas apresentadas, mas pode-se inferir que as
unidades de ingredientes tenham baixa cardinalidade relativa
na tabela I
9
Hashing ou
Árvore B+
P.cod-ref
É chave primária, há apenas comparações por igualdade
10
Obs: não há necessidade de índices para T.quantidade e
O.duração (heurística: não indexar valores) e P.descrição (a
busca é por LIKE com %X% e pode-se inferir que
Cardinalidade (P.descrição) ≈ Cardinalidade (P)
p.3
Download

Exercício com Gabarito