Bases de Dados Algoritmos para junção Algoritmos para junções Há vários algoritmos para processar junções nested-loop join block nested-loop join indexed nested-loop join merge-join hash-join A escolha é baseada no custo de cada um deles 2 1
Nested-loop join Para calcular a junção-θ (r θ s) for each tuplo t r in r for each tuplo t s in s se o par (t r,t s ) satisfaz a condição θ então adicionar t r t s ao resultado Custos transferência: b r + n r * b s localização: b r + n r 3 Block nested-loop join for each bloco B r of r for each bloco B s of s for each tuplo t r in B r for each tuplo t s in B s se o par (t r,t s ) satisfaz a condição θ então adicionar t r t s ao resultado Custos transferência: b r + b r * b s localização: b r + b r 4 2
Indexed nested-loop join Para calcular a junção natural (r s) for each tuplo t r in r usar índice para encontrar tuplos de s que têm o mesmo valor que t r no atributo da junção Custo: b r (t T + t S ) + n r c onde c é o custo de uma operação de selecção com índice depe do índice e do atributo da junção ver algoritmos de selecção A3, A4, A5 5 Merge-join Para calcular a junção natural (r s) 1. ordenar relações r e s pelo atributo da junção 2. fundir as duas relações numa só (merge) semelhante ao passo 2 da ordenação Custos (*) transferência: b r + b s localização: b r + b s e ainda os custos de ordenação (*) assumindo que os registos com o mesmo valor do atributo cabem todos num bloco 6 3
Hash-join Para calcular a junção natural (r s) não requer ordenação abordagem build-and-probe Se a relação mais pequena couber em memória 1. build criar índice hash em memória para essa relação 2. probe pesquisar os elementos da outra relação no índice Se nenhuma das relações couber em memória 7 Hash-join Para calcular a junção natural (r s) subdividir os registos de r e s em n partições função de hash diz qual é a partição para um dado registo a função calcula a partição com base no atributo da junção aplicar build-and-probe a cada par de partições custos transferência: 3*b b r + 3*b b s localização: 2*b r + 2*b s + 2*n h n h = nº de partições 8 4
Junções com múltiplos critérios Junção com conjunção de critérios (r θ1 Λ θ 2 Λ θ n s) usar nested-loop join, block nested-loop join, ou aplicar diferentes algoritmos para cada (r θi s) e no final fazer a intersecção dos resultados de cada junção Junção com disjunção de critérios (r θ1 V θ 2 V θ n s) usar nested-loop join, block nested-loop join, ou aplicar diferentes algoritmos para cada (r θi s) e no final fazer a união dos resultados de cada junção 9 Algoritmos de junção no Postgres indexed nested-loop join merge join hash join 10 5
Bases de Dados Algoritmos para outras operações Outras operações Eliminação de duplicados ordenar e apagar tuplos adjacentes em duplicado optimização: durante própria ordenação, não colocar na saída tuplos duplicados select distinct customer_name from depositor; 12 6
Outras operações Agregações exemplo: branch_name G sum(balance) (account) usando ordenação ou hashing é possível agrupar tuplos pelo atributo branch_name depois aplica-se a função de agregação (sum) a cada grupo optimização: durante a própria ordenação (passos 1 e 2) ir calculando agregações "parciais" com tuplos que estejam no mesmo grupo funciona para as funções count, min, max, sum para a função avg, calcular via agregações parciais de sum e count e no fim dividir um resultado pelo outro 13 Outras operações Operações com conjuntos (r U s, r s, r s) podem ser implementadas como variantes do algoritmo hash-join dividir ambas as relações em partições para cada partição i construir um índice do tipo hash para r i e agora r U s : colocar no índice todos os tuplos de s i excepto os que já lá estiverem r s : devolver os tuplos de s i mas apenas aqueles que já estão no índice r s : retirar do índice os tuplos de s i que já lá estiverem adicionar conteúdo do índice ao resultado 14 7
Outras operações Junções externas (r s, r s, r s) pode ser implementadas como variantes do algoritmo merge-join r s : durante o merge cada tuplo de r que não encontra correspondente em s é colocado no resultado com nulls nos lugares dos atributos de s junções externas à direita e completas implementadas de forma semelhante 15 Bases de Dados Avaliação de expressões 8
Avaliação de expressões Existem duas técnicas para avaliação de expressões materialização resolver uma operação de cada vez resultados intermédios são guardados em disco pipelining resolver todas as operações ao mesmo tempo assim que saia um tuplo de uma operação, é logo passado para o cálculo da operação seguinte, mesmo antes da primeira i ter terminado 17 Materialização Π customer_name (σ balance < 2500 (account) customer) 1. selecção 2. guardar resultado 3. junção 4. guardar resultado 5. projecção 6. mostrar resultado custos em materialização soma dos custos das operações individuais mais o custo de transferência de resultados intermédios 18 9
Pipelining Π customer_name (σ balance < 2500 (account) customer) 1. procurar um registo com balance < 2500 2. fazer junção natural desse registo com os registos em customer 3. projectar os resultados (se houver) para customer_name 4. colocar o resultado (se houver) na saída 5. voltar a 1. e repetir para todos os registos com balance < 2500 não é necessário guardar resultados intermédios menor custo que a materialização mas nem sempre o pipelining pode ser usado p.ex. em ordenações e hash-joins 19 Materialização e pipelining no Postgres select customer_name from depositor natural join account group by customer_name having sum(balance) >= all (select sum(balance) from depositor natural join account group by customer_name); 20 10