Prévia do material em texto
Exercício Planos de Execução -
Custos
Considere o seguinte esquema de banco de dados:
• Disciplina(DID, Dnome, PID)
• Professor(PID, Pnome, Dept)
• Aula(DID,Dia_Semana, Sala, Horario)
• Considere a seguinte consulta sobre este banco de
dados: “Quais os nomes dos professores que
ministram disciplinas às sextas-feira na sala 1F250 ?”.
Suponha que os seguintes dados sejam conhecidos:
• DID é chave da tabela Disciplina
• Tabela Disciplina tem 100 páginas,
• PID é chave de Professor
• Tabela Professor tem 100 páginas
• {DID,Dia_Semana} é chave da tabela Aula
• Tabela Aula tem 900 páginas.
• Tem-se 10 valores para o atributo Sala.
• Os 10 valores do atributo Sala estão uniformemente distribuídos na tabela Aula, isto é,
para cada valor tem-se o mesmo número de tuplas com este valor na tabela Aula.
• Os valores dos dias de semana são 6: segunda, terça, quarta, quinta, sexta e sábado.
• Os valores dos horários são 15: 5 na parte da manhã, 5 na parte da tarde e 5 à noite.
Pede-se:
a. Escreva um comando SQL padrão para esta consulta.
b. Dê o plano de execução canônico correspondente, lembrando que a polí ca
seguida pelo o mizador no caso de múl plas junções é a polí ca “le linear”
(isto é, em cada junção, a relação à DIREITA é sempre uma relação de base).
No plano de execução canônico, suponha que a projeção e seleção sejam
executadas “on the fly” e que o algoritmo “simple nested loop join” seja
u lizado para as junções. Sempre que puder, realize junções em pipeline.
Observação: 4 planos canônicos le linear podem ser gerados, alternando-se os
2 Joins e alternando-se as relações do 1º Join. Os 4 planos são gerados e o
mais eficiente é considerado para as o mizações futuras.
Solução
• Escreva um comando SQL padrão para esta
consulta.
• SELECT P. Pnome
FROM Disciplina D, Professor P, Aula A
WHERE D.DID = A. DID AND D.PID = P.PID
AND A.DIA_Semana = ‘sexta-feira’ AND
A.Sala = ‘1F250’;
• Plano 1
Construção de Temp1 (1eira. Junção)
Custo = 100 + 100*100 = 10.100 I/Os
Tamanho de Temp1 = 200*5/6 = 167
Observação: Repare que Temp1 não será gravada, pois a operação
de junção acima será feita em pipeline.
Custo do 2º Join (em Did)
Custo = 167*900 = 150.300 I/Os
Custo total do plano 1 = 10.100 + 150.300 = 160.400 I/Os
• Plano 2
Construção de Temp1 (1eira junção)
Custo = 100 + 100*100 = 10.100 I/Os
Tamanho de Temp1 = 200*5/6 = 167
Observação: Repare que Temp1 não ser gravada, pois a
operação de junção acima será feita em pipeline.
Custo do 2º Join (em Did)
Custo = 167*900 = 150.300 I/Os
Custo total do plano = 10.100 + 150.300 = 160.400 I/Os
• Plano 3
Construção de Temp1
Custo = 100 + 900*100 = 100 + 90000 = 90.100
Tamanho de Temp1 = 1800*6/7 = 1543
Custo do 2º Join (em Pid)
Custo = 1543*100 = 154.300
Custo total do plano = 90.100 + 154.300 = 244.400 I/Os
• Plano 4
Construção de Temp1
Custo = 900 + 900*100 = 900 + 90000 = 90.900
Tamanho de Temp1 = 1800*6/7 = 1543
Custo do 2º Join (em Pid) Custo = 1543*100 = 154.300
Custo total do plano = 90.900 + 154.300 = 245.200 I/Os
• Plano 5 (4 o mizado)
Custo do plano: Leitura da tabela A = 900
Tamanho da seleção = 900/60 = 15
Custo do primeiro join: 15*100 = 1.500
Tamanho da primeira junção: 30*6/7=26
Custo do segundo join: 26*100 = 2.600
Custo total do plano = 900 + 1.500 + 2.600 = 5000 I/Os
• Plano 6 (3 o mizado)
Custo de criação de Temp1 = 900 (Temp1 = σ(A) ) Tamanho de
Temp1 = 900/(6*10) = 900/60 = 15
Custo de gravar Temp1 = 15
Custo do 1º Join = 100 + 100*15 = 1.600
Resultado do 1º Join = Temp2
Tamanho de Temp2 = 30*6/7 = 26
Custo do 2º Join (pode ser feito em pipeline) pois a tabela à
direita (P) está materializada:
26*100 = 2.600
Custo total = 900 + 15 + 1.600 + 2.600 = 5.115 I/Os
Não
precisa