240 likes | 321 Views
Algoritmos para Seleção e Projeção. AULA 15 SISTEMAS DE BANCO DE DADOS. Seleção. SELECT * FROM R WHERE R.A op ‘a’ op: =, < , > , ≤ , ≥ Tamanho de R = M páginas Número de tuplas por página = Pr. R não ordenada, não tem índice em A. Melhor solução = scan da relação R
E N D
Algoritmos para Seleção e Projeção AULA 15 SISTEMAS DE BANCO DE DADOS
Seleção SELECT * FROM R WHERE R.A op ‘a’ op: =, < , > , ≤ , ≥ Tamanho de R = M páginas Número de tuplas por página = Pr
R não ordenada, não tem índice em A • Melhor solução = scan da relação R • Custo = M I/Os
R sem índice, mas ordenada por A • Busca binária até encontrar a primeira tupla da resposta. • Custo da busca = log2M = log21000 = 10 I/Os • Scan de R a partir desta tupla para recuperar o resto das tuplas que casam. • Custo : depende do número de tuplas que satisfazem a condição da resposta. • Se A é chave de R e op é a igualdade: custo = 1 • Se A não é chave de R , op é a igualdade, as tuplas com valores iguais do atributo A cabem em X páginas (distribuição uniforme) então Custo = X • Em geral Custo total = • log2M + custo de escanear o restante da relação R.
R tem índice B+ tree em ACondição de seleção : A > a SELECT * FROM R WHERE A > 34 40 51 63 20 33 10* 15* 20* 27* 33* 37* 40* 46* 51* 55* 63* 97* Indice agrupado <37, a0, b0> <63, a0, b0> <110, a0, b0> <40, a1, b1> <97, a1, b1> <120, a1, b1> <46, a2, b2> <99, a2, b2> <122, a2, b2> <51, a3, b3> <101, a3, b3> <200, a3, b3> <55, a4, b4> <102, a4, b4> <239, a4, b4>
R tem índice B+ tree em A, Condição de seleção : A > a Índice é agrupado • Custo = 2 a 4 I/Os até encontrar a primeira entrada do arquivo de índice. • Custo de recuperar todas as tuplas no banco de dados • As tuplas satisfazendo a condição de seleção estão contidas em p.M páginas, onde • 1 registro de dados = p registros de índices • M = número de páginas do arquivo de indice contendo entradas com chave A > a • Custo Total de recuperar todas as tuplas: • 4 + p.M
<110, a0, b0> <37, a0, b0> <40, a0, b0> <120, a1, b1> <73, a1, b1> <18, a1, b1> <46, a2, b2> <19, a2, b2> <99, a2, b2> <200, a3, b3> <10, a3, b3> <101, a3, b3> <239, a4, b4> <97, a4, b4> <102, a4, b4> R tem índice B+ tree em ACondição de seleção : A > a SELECT * FROM R WHERE A > 34 40 51 63 20 33 10* 15* 20* 27* 33* 37* 40* 46* 51* 55* 63* 97* Indice não agrupado Pid = 2 Pid = 10 Pid = 7
R tem índice B+ tree em A, Condição de seleção: A > a Indice não agrupado: • Custo de recuperar todas as tuplas no banco de dados após encontrar a primeira entrada no arquivo de indice pode ser igual ao número de tuplassatisfazendo a condição A > a • Solução: ordenar as entradas do arquivo de indice pelo page-id do campo * • Entrada do indice = < chave, page-id, slot-id> • Custo = número de páginas contendo tuplas com A > a
Exercicio • Calcular o custo de: Select * From R where A = a nos seguintes casos: • Indice agrupado, B+ tree • Indice não agrupado, B+ tree
Exemplo • Select * From R where R.name < ‘C%’ • M = número de páginas de R = 1000 • Nomes são uniformemente distribuídos com relação à letra inicial. • 26 letras no alfabeto • Portanto: 10% dos nomes satisfazem < ‘C%’ • 10000 tuplas satisfazem < ‘C%’ • 100 páginas • N = número de páginas do arquivo de indice com R.name < ‘C%’ • Custo Indice : • B+tree agrupado: 4 + 100 = 104 I/Os • B+tree não-agrupado: 4 + N + 10000 = 10004 + N I/Os • B+tree não-agrupado com arquivo de indice ordenado pelo page-id • 4 + 100 + custo de se ordenar o arquivo de indice pelo page-id • B+tree não-agrupado: dependendo do número de tuplas satisfazendo a condição de seleção e a distribuição destas tuplas, a melhor solução é não utilizar o indice e fazer um simples scan do arquivo.
R tem indice Hash em A Condição de seleção : A = a • Custo de se localizar a página do bucket no arquivo de índice: 1 a 2 I/Os (depende se há diretório de ponteiros) • Custo para se obter as tuplas satisfazendo a condição de seleção: depende se o índice é agrupado ou não. • Se A = chave de R: custo = 1 I/O
Exemplo Select * From R where R.name = ‘Joe’ M = número de páginas de R = 1000 100 tuplas com R.name = ‘Joe’ • Custo de se encontrar o bucket correspondente a ‘Joe’ no indice = 1 a 2 I/O • Custo de se obter as tuplas no banco de dados = varia de 1 a 100 I/Os • Se as 100 tuplas estão espalhadas em 5 páginas, ordenando-se o indice pelo page-id, pode-se recuperar estas tuplas em 5 I/Os. • Logo, o custo total é de 2 + 5 + custo da ordenação.
Condições Gerais de Seleção SELECT * FROM R WHERE R.A op ‘a’ AND R.B op ‘b’ op: =, < , > , ≤ , ≥ Tamanho de R = M páginas Número de tuplas por página = Pr
Condição de seleção em FNC • (A11 op a11OR ... OR An1 op an1) AND (A12 op a12OR ... OR An2 op an2) AND .... AND (A1k op a1kOR ... OR Ank op ank) • Exemplo: (day < 8/9/2002 OR R.name = ‘Joe’) AND (R.id = 5 OR R.name = ‘Joe’)
Caso 1: sem OR • Solução 1 : um só indice • utilizar indice num atributo que aparece na condição de seleção, que é mais ‘seletivo’ • A medida que se recupera as tuplas satisfazendo esta condição elimina-se as tuplas que não satisfazem alguma das outras condições.
Caso 1: sem OR • Solução 2: diversos indices • Utiliza-se diversos indices, sobre alguns atributos aparecendo na condição de seleção. • Para cada condição Ai = ai recupera-se as páginas do arquivo de indice satisfazendo esta condição. • Ordena-se as entradas de cada indice pelo page-id • Faz-se a intersecção das entradas com os mesmos page-ids • Recupera-se as tuplas contidas nas páginas indicadas pelos page-ids e elimina-se aquelas que não satisfazem as outras condições da seleção (para as quais não foram considerados indices).
Exemplo • Condição: • day < 8/9/2002 AND R.id = 5 AND AND S.age > 35 • Usando B+tree em day recupera-se o conjunto das entradas E1 com day < 8/9/2002 • Usando um indice Hash em R.id recupera-se o conjunto de entradas E2 com R.id = 5 • Ordena-se cada conjunto de entradas pelo page-ids • Considera-se a intersecção das entradas pelos rids <a1,p1,s1> ε E1 e <a2, p1, s1> ε E2 então <a1,p1,s1> e <a2, p1, s1> entram na intersecção • Recupera-se as tuplas do banco de dadas, através das entradas contidas na intersecção.
Caso 2 : com OR • A = a1 OR B = b1 • Indice em A, não há indice em B • Melhor solução : scan (o indice em A não ajuda nada) • (A = a1 OR B = b1) AND C = c1 • Indice em A, não há indice em B, indice em C • Melhor solução: utilizar o indice em C • A = a1 OR B = b1 • Indice em A, indice em B • Melhor solução: • recupera-se as entradas no arquivo de indice para A = a1 : • recupera-se as entradas no arquivo de indice para B = b1 : • Faz-se a união destes dois conjuntos de entradas • Ordena-se este conjunto pela page-id
Projeção SELECT DISTINCT R.A, R.B FROM R Duas etapas principais : • Remover colunas indesejáveis • Eliminar as duplicatas (o mais difícil)
Projeção usando Ordenação • Scan de R para produzir as tuplas projetadas (sem os campos indesejáveis) • Ordena o resultado, utilizando a combinação de todos os atributos da projeção como chave da ordenação • Scan do resultado ordenado para eliminação das tuplas adjacentes repetidas.
Custo • Scan de R = M I/Os • T = número de páginas produzidas da relação projetada (T = c.M onde c < 1) T depende do número e do tamanho dos campos suprimidos em cada tupla. • Custo passo 1 = M + T • Custo passo 2 (Ordenação) = 2T (logB-1T + 1) • Custo passo 3 = T • Custo total = M + T + 2T (logB-1T + 1) +T
Exemplo M = 1000 Cada tupla de M ocupa 40 bytes Cada tupla projetada ocupa 10 bytes Logo T = 250 páginas B = 40 páginas • Custo passo 1 = 1250 • Custo passo 2 = 2. 250 (log39 250 + 1) = 2. 250 . 2 = 1000 • Custo passo 3 = 250 • Custo total = 2500 I/Os
Otimização • Pode-se projetar as tuplas durante a primeira iteração da ordenação. • A partir da segunda iteração da ordenação já vai-se eliminando as duplicatas à medida que são criados os subarquivos ordenados.
Exemplo M = 1000 T = 250 páginas B = 40 páginas • Passo 0 da ordenação: • 1000 páginas são lidas em memória durante 1000/40 = 25 etapas • A cada etapa é criado um subarquivo em disco, ordenado com 40/4 = 10 páginas • No total, são 250 páginas escritas no disco, divididas em 25 subarquivos ordenados e projetados com 10 páginas cada um. • Passo 1 da ordenação: • Há espaço suficiente na memória (40 > 25) para se fazer o merge dos 25 subarquivos e simultaneamente eliminar-se as duplicatas. • São lidos 250 páginas • Resultado: um único arquivo ordenado, projetado e onde as duplicatas foram eliminadas. • Custo total = 1250 + 250 = 1500 I/Os