Sistemas de Gerência de Bancos de Dados 4 - Consultas e Transações 4.1- Processamento de Consultas 1
Introdução Etapas do Processamento de uma consulta: linguagem do usuário análise sintática e tradução otimização execução Análise Sintática linguagem intermediária Tópicos: CAT Otimização linguagem interna Interfaces Catálogo Execução Otimização Execução BD linguagem elementar 2
Linguagem do usuário Linguagem intermediária Linguagem interna Linguagem elementar Interfaces 3
Interfaces - Linguagem do Usuário Consultas simples em SQL: um subconjunto de SQL, incluindo uma cláusula INTO armazenando a resposta e restringindo a qualificação a uma expressão booleana sobre comparações, negadas ou não Formato genérico de uma consulta: select <lista resultante> into <relação resultante> from <lista de relações> where <qualificação> onde a qualificação é uma expressão booleana composta de termos da forma: seleção r.a<op><constante> restrição r.a<op>r.b junção r.a<op>s.b 4
Interfaces - Linguagem do Usuário Classificação das cláusulas de uma consulta: univariável: todos os literais da cláusula são sobre a mesma variável multivariável homogênea: a cláusula é univariável, ou todos os literais são sobre as mesmas 2 variáveis heterogênea Classificação das Consultas herdada das classificação das cláusulas 5
Exemplo: Interfaces - Linguagem do Usuário select F.NOME from FORNECEDOR F, FORNECIMENTO FN, REGIÃO R P1 where F.NUMERO = FN.NUMERO P2 and (FN.CODIGO = 10 or FN.CODIGO = 12) P3 and FN.QUANT > 10.000 P4=(P41 or P42) and (F.SEDE = R.ESTADO or F.SEDE = 'DF') P5 and R.NOME = 'CENTRO SUL' P1 : multivariável e homogênea P2, P3 e P5 : univariáveis P4 : multivariável e heterogênea (primeiro literal sobre F e R mas segundo literal sobre F apenas) 6
Interfaces - Linguagem Intermediária Álgebra relacional simples: subconjunto da álgebra relacional com o mesmo poder expressivo que o subconjunto de SQL adotado conjunto de operadores considerado: projeção seleção junção cartesiano união proj[x](t) sel[p](t) join[p](t,u) prod(t,u) union(t,u) 7
Esquema Conceitual Interfaces - Exemplo create table PRODUTO (CODIGO (integer), NOME (char(10)), MELHOR_FORN (integer) ) create table FORNECIMENTO (NUMERO (integer), CODIGO (integer), QUANTIDADE (integer), LOCAL (char(5)) ) Consulta expressa em SQL select P.CODIGO from PRODUTO P, FORNECIMENTO F where F.NUMERO = '41.738' and F.CODIGO = P.CODIGO and P.MELHOR_FORN = '41.738' 8
Consulta expressa na álgebra Interfaces - Exemplo proj[codigo.produto] (join[codigo.fornecimento = CODIGO.PRODUTO] (sel(numero='41.738')(fornecimento), sel[melhor_forn = '41.738'](MELHOR_FORN))) proj[codigo.produto] join[codigo.fornecimento = CODIGO.PRODUTO] sel(numero='41.738') sel[melhor_forn = '41.738'] FORNECIMENTO MELHOR_FORN 9
Interfaces - Linguagem Interna Estruturas Internas tabelas = seqüências de registros internos tipos de tabelas tabelas externas: tabelas em memória secundária tabelas de inversão: arquivos invertidos para tabelas externas tabelas internas: tabelas em memória principal tabelas transientes: agem como área intermediária entre operações consecutivas IDR = campo especial dos registros com um identificador único 10
Operações sobre Tabelas CRIA_TAB(T,X) CRIA_INV(T,Y,U) DESTROI(T) ORD(T,X,tipo;V) onde tipo=ascente ou descente UNIAO(T,U;V) Interfaces - Linguagem Interna 11
Interfaces - Linguagem Interna Operações sobre Tabelas SELEÇÃO(T,X,P(T);V) - seleção sobre T constrói uma nova tabela V(IDR,X) tal que v é um registro de V sse existe t em T tal que v(x)=t(x) e v(idr) é uma nova id t satisfaz a P(T) 12
Interfaces - Linguagem Interna Operações sobre Tabelas JUNÇÃO(T,U,X,Y,P(T,U),P(T),P(U);V) - junção tradicional constrói uma nova tabela V(IDR,X,Y) tal que v é um registro de V sse existem t e u em T e U tais que v(x)=t(x) e v(y)=u(y) e v(idr) é uma nova id t satisfaz a P(T) u satisfaz a P(U) t e u concatenadas satisfazem a P(T,U) 13
Interfaces - Linguagem Interna Programas na Linguagem Interna: programas multi-thread cujas operações e estruturas de dados básicas são aquelas descritas anteriormente 14
Interfaces - Linguagem Elementar Estruturas Físicas armazena dados, estruturas auxiliares de acesso aos dados, informações de controle, etc... organização: memória secundária dividida em segmentos segmentos divididos em páginas com id único Ações Elementares: R(X) W(X) leia todas as páginas cujos id's estão no conjunto X mova do buffer pool para memória secundária todas as páginas cujos id's estão em X r(x,p,s) recupere o conteúdo da página x a partir de p até p+s-1 w(x,p) mude o conteúdo da página x a partir da posição p (o novo valor e o comprimento foram omitidos...) 15
Catálogo Informações sobre uma tabela T: n(t) p(t) = número de registros de T = número de páginas ocupadas por T p'(t) = p(t) se T for passada como tabela externa = 0 se T for passada como tabela interna s(t) f(t) f(t) = tamanho do registro de T = número médio de registros de T por página = tamanho da página / s(t) (supondo que T não compartilha páginas com outras tabelas e que os registros de T são de tamanho fixo) 16
Catálogo Informações sobre uma lista de atributos X de uma tabela T: V(X,T) = número de valores distintos de X que ocorrem em T SC(X,T)= número médio de registros de T que satisfazem a uma condição de igualdade em X SC(X,T)= 1, se X é chave de T SC(X,T)= n(t) / V(X,T), se X não é chave de T MAX(T,X) = maior valor de T[X] MIN(T,X) = menor valor de T[X] 17
Informações sobre um índice U: Catálogo CHV(U)= número de chaves distintas em U p(u) f(u) h(u) = número de páginas conto chaves em U = número médio de filhos de um nó, para uma árvore B = número de níveis de U = 1, se U é uma tabela de hash = [log(v(x,t)], se U é uma árvore B sobre as chaves X de T 18
Catálogo Notação: Q é uma consulta U1,...,Un são as relações varridas por Q B é a qualificação de Q T é a relação resultante de Q, ou seja, T é o subconjunto de U = U1 x...x Un que satisfaz B Fator de Seletividade: F(B) = percentagem de tuplas de U que satisfazem B CAR(T) = CAR(U1) x...x CAR(Un) x F(B) 19
Catálogo Estimação de F(B): u i.x = valor F(B) = 1 / V(X,Ui) F(B) = 1 / CHV(V), se V for uma inversão de U i por X F(B) = 1 / 10, se não houver informação sobre T[X] u i.x > valor F(B) = (MAX(U i,x) - valor) / (MAX(U i,x) - MIN(U i,x)) F(B) = 1 / 10, se o domínio não for aritmético 20
Catálogo Estimação de F(B): u a.x = u b.y U a U b X = x Y = x no máximo uma tupla de U b com Y=x Se Y for chave (primária) de U b então cada tupla de U a se junta com no máximo uma tupla de U b. Logo, join[u a.x = u b.y](u a,u b ) não pode ter mais tuplas do que U a. 21
Catálogo Estimação de F(B): u a.x = u b.y F(B) = join[u a.x = u b.y](u a, U b ) ( U a * U b ) Se Y for chave de U b então cada tupla de U a se junta com no máximo uma tupla de U b. Logo, join[u a.x = u b.y](u a, U b ) U a, ou seja: F(B) = 1 / U a Se X for chave de U a então join[u a.x = u b.y](u a, U b ) U b. Ou seja: F(B) = 1 / U b Se X for chave de U a e Y for chave de U b, então : F(B) = min(1 / U a, 1 / U b ) = 1 / max( U a, U b ) 22
Catálogo Estimação de F(B): u a.x = u b.y U a U b X = x Y = x Y = x Y = x Y = x 1 * U b CHV(V b ) Se V b for uma inversão de U b por Y, então estima-se que 1 * U b tuplas de U b se juntem com cada tupla de U a. CHV(V b ) Logo, join[u a.x = u b.y](u a,u b ) não pode ter mais tuplas do que U a * ( 1 * U b ) CHV(V b ) 23
Catálogo Estimação de F(B): u a.x = u b.y F(B) = join[u a.x = u b.y](u a, U b ) ( U a * U b ) Se V b for uma inversão de U b por Y, então join[u a.x = u b.y](u a, U b ) U a * ( 1 * U b ), logo: CHV(V b ) F(B) = 1 / CHV(V b ) Se V a for uma inversão de U a por X, então F(B) = 1 / CHV(V a ) Se V a for uma inversão de U a por X e V b for uma inversão de U b por Y, então : F(B) = 1 / max( CHV(V a ), CHV(V b ) ) 24
Catálogo Estimação de F(B): u a.x = u b.y F(B) = 1 / U a se X for chave de U a F(B) = 1 / max( U a, U b ) se X for chave de U a e Y for chave de U b F(B) = 1 / CHV(V a ) se V a for uma inversão de U a por X F(B) = 1 / max(chv(v a ), CHV(V b )) se V a for uma inversão de U a por X e V b for uma inversão de U b por Y F(B) = 1 / 10 (na falta de informação) u i.x > u j.y F(B) = (MAX(U i,x) - MIN(U j,y) / (MAX(U i,x) - MIN(U i,x)) F(B) = 1 / 10 (se o domínio de A não for aritmético) 25
Catálogo Estimação de F(B): B = B1 or B2 F(B) = F(B1) + F(B2) - F(B1)*F(B2) B = B1 and B2 F(B) = F(B1) * F(B2) B = not B1 F(B) = 1 - F(B1) 26
Execução Execução de programas na linguagem interna: implementação das operações sobre tabelas: seleção seleção sequencial seleção direta seleção por união seleção por interseção junção junção aninhada junção aninhada por página junção aninhada indexada junção por intercalação junção por hash execução de programas 27
Execução SELEÇAO_SEQUENCIAL(T,X,P(T);V) T X P(T) V - tabela externa - atributos de T que comporão a resposta V - predicado sobre T - resposta conto a projeção em X das tuplas de T que satisfazem P(T) crie V como vazia for each t em T do if t satisfaz P(T) then acrescente t[x] a V 28
Execução custo da operação: C = número de páginas de T lidas (custo de I/O) + número de páginas de V gravadas + W * número de tuplas de T processadas (custo de CPU) caso 1: T e V externas com os registros agrupados C = p(t) + n(t)*f(p(t))* X / tamanho da página + W*n(T) (teste é feito para todas as tuplas em T) onde X denota o comprimento de X (outros casos deixados como exercício) 29
Execução SELEÇÃO_DIRETA(T,X,P(T),U,Q(T);V) T X P(T) U Q(T) V - tabela externa - atributos de T que comporão a resposta V - predicado sobre T - tabela de inversão sobre T nos atributos Y - expressão booleana conto atributos apenas em Y - resposta conto a projeção em X das tuplas de T que satisfazem P(T) and Q(T) crie V como vazia crie P com todos os apontadores para registros de T que satisfazem Q(T), usando U for each p em P do recupere em t o registro de T apontado por p if t satisfaz P(T) then acrescente t[x] a V 30
Execução custo da operação: C = número de páginas de T lidas (custo de I/O) + número de páginas de U lidas + número de páginas de V gravadas + W * número de tuplas de T processadas (custo de CPU) caso 1: V externa com os registros agrupados premissas: cada registro de T que satisfaz Q(T) requer leitura de 1 página determinar que chaves satisfazem Q(T) requer n(u) * F(Q(T)) acessos a páginas de U C = n(t) * F(Q(T)) + n(u) * F(Q(T)) + n(t) * F(P(T)) * F(Q(T) * X / tamanho da página + W * n(t) * F(Q(T)) (teste de P(T) é feito para todas as tuplas em T que satisfazem a Q(T)) (outros casos deixados como exercício) 31
Execução SELEÇÃO_UNIÃO(T,X,P(T) or P'(T),U,U';V) T - tabela externa X - atributos de T que comporão a resposta V P(T) or P'(T) - predicado sobre T U - tabela de inversão sobre T capaz de resolver P(T) U' - tabela de inversão sobre T capaz de resolver P'(T) V - resposta conto a projeção em X das tuplas de T que satisfazem P(T) or P'(T) crie V como vazia crie P em memória com todos os apontadores para registros de T que satisfazem P(T), usando U crie P' em memória com todos os apontadores para registros de T que satisfazem P'(T), usando U' for each p em P união com P' do recupere em t o registro de T apontado por p acrescente t[x] a V 32
Execução SELEÇÃO_INTERSEÇÃO(T,X,P(T) and P'(T),U,U';V) T - tabela externa X - atributos de T que comporão a resposta V P(T) and P'(T) - predicado sobre T U - tabela de inversão sobre T capaz de resolver P(T) U' - tabela de inversão sobre T capaz de resolver P'(T) V - resposta conto a projeção em X das tuplas de T que satisfazem P(T) and P'(T) crie V como vazia crie P em memória com todos os apontadores para registros de T que satisfazem P(T), usando U crie P' em memória com todos os apontadores para registros de T que satisfazem P'(T), usando U' for each p em P interseção com P' do recupere em t o registro de T apontado por p acrescente t[x] a V 33
Execução JUNÇÃO_ANINHADA(T,U,X,Y,P(T,U),P(T),P(U);V) T, U - tabelas externas X, Y - atributos de T e U que comporão a resposta V P(T,U) - predicado de junção entre T e U P(T), P(U) - predicados adicionais sobre T e U V - resposta conto a projeção em X e Y das tuplas de T e U que satisfazem P(T,U) and P(T) and P(U) t 1 P(t) P(u) 2 u v 3 v 34
Execução JUNÇÃO_ANINHADA(T,U,X,Y,P(T,U),P(T),P(U);V) T, U - tabelas externas X, Y - atributos de T e U que comporão a resposta V P(T,U) - predicado de junção entre T e U P(T), P(U) - predicados adicionais sobre T e U V - resposta conto a projeção em X e Y das tuplas de T e U que satisfazem P(T,U) and P(T) and P(U) inicie V como vazia; for each registro t de T que satisfaz a P(T) do substitua t em P(T,U) criando P(t,U); for each registro u de U que satisfaz a P(t,U) e P(U) do acrescente um registro v a V criado a partir de t e u 35
Execução JUNÇÃO_ANINHADA_POR_PÁGINA(T,U,X,Y,P(T,U),P(T),P(U);V) T, U - tabelas externas agrupadas X, Y - atributos de T e U que comporão a resposta V P(T,U) - predicado de junção entre T e U P(T), P(U) - predicados adicionais sobre T e U V - resposta conto a projeção em X e Y das tuplas de T e U que satisfazem P(T,U) and P(T) and P(U) pagina p t 1 pagina p P(t) 2 página q u página q P(u) v 3 v 36
Execução JUNÇÃO_ANINHADA_POR_PÁGINA(T,U,X,Y,P(T,U),P(T),P(U);V) T, U - tabelas externas agrupadas X, Y - atributos de T e U que comporão a resposta V P(T,U) - predicado de junção entre T e U P(T), P(U) - predicados adicionais sobre T e U V - resposta conto a projeção em X e Y das tuplas de T e U que satisfazem P(T,U) and P(T) and P(U) inicie V como vazia; for each página p de T do for each registro t em p que satisfaz P(T) do substitua t em P(T,U) criando P(t,U) for each página q de U do for each registro u em q que satisfaz P(t,U) e P(U) do acrescente um registro v a V criado a partir de t e u 37
Execução JUNÇÃO_ANINHADA_INDEXADA(T,U,X,Y,P(T,U),P(T),P(U),R;V) T, U - tabelas externas X, Y - atributos de T e U que comporão a resposta V P(T,U) - predicado de junção entre T e U P(T), P(U) - predicados adicionais sobre T e U R V - índice sobre U que resolve P(t,U) - resposta conto a projeção em X e Y das tuplas de T e U que satisfazem P(T,U) and P(T) and P(U) t P(t,U) R 3 P(t) 1 2 P(t,u) P(u) e P(t,u) v 3 4 u v 38
JUNÇÃO_ANINHADA_INDEXADA(T,U,X,Y,P(T,U),P(T),P(U),R;V) T, U - tabelas externas X, Y - atributos de T e U que comporão a resposta V P(T,U) - predicado de junção entre T e U P(T), P(U) - predicados adicionais sobre T e U R V - índice sobre U que resolve P(t,U) - resposta conto a projeção em X e Y das tuplas de T e U que satisfazem P(T,U) and P(T) and P(U) inicie V como vazia; for each registro t de T que satisfaz a P(T) do substitua t em P(T,U) criando P(t,U) crie S com todos os apontadores para registros de U que satisfazem P(t,U), usando R for each s em S do recupere em u o registro de U apontado por s if u satisfaz P(U) then acrescente um registro v a V criado a partir de t e u 39
Execução JUNÇÃO_INTERCALAÇÃO(T,U,X,Y,P(T,U),P(T),P(U);V) T, U - tabelas externas X, Y - atributos de T e U que comporão a resposta V P(T,U) - predicado de junção entre T e U da format.x<op>u.y T e U estão ordenados por X e Y, respectivamente, em uma ordem de junção compatível com T.X<op>U.Y P(T), P(U) - predicados adicionais sobre T e U V - resposta conto a projeção em X e Y das tuplas de T e U que satisfazem P(T,U) and P(T) and P(U) t varredura 1 P(t) P(u) v 2 varredura u 3 v 40
JUNÇÃO_INTERCALAÇÃO(T,U,X,Y,P(T,U),P(T),P(U);V) inicie V como vazia inicie t0 com o primeiro registro de T que satisfaz P(T) (* t0 será nulo caso não exista inicie u0 com o primeiro registro de U que satisfaz P(U) (* u0 será nulo caso não exista while t0 não for nulo e u0 não for nulo do substitua t0 em T.X<op>U.Y criando P(t0,U) crie uma tabela interna temporária M, inicialmente vazia while u0 não for nulo e u0 satisfizer P(t0,U) do acrescente u0 a M u0 := próximo registro de U a partir de u0 que satisfaz P(U) x := t0[x] while t0[x] = x do for each registro m em M do acrescente um registro v a V criado a partir de t0 e m t0 := próximo registro de T a partir de t0 que satisfaz P(T) 41
Execução JUNÇÃO_HASH(T,U,X,Y,P(T,U),P(T),P(U);V) T, U - tabelas externas X, Y - atributos de T e U que comporão a resposta V P(T,U) - predicado de junção entre T e U da forma T.X=U.Y P(T), P(U) - predicados adicionais sobre T e U V - resposta conto a projeção em X e Y das tuplas de T e U que satisfazem P(T,U) and P(T) and P(U) Tabela T HT1 P(t) 1 HT2 2 P(u) 4 HU1 HU2 3 Tabela U HT3 v HU3 HT4 v 5 HU4 42
Execução JUNÇÃO_HASH(T,U,X,Y,P(T,U),P(T),P(U);V) inicie V como vazia for each t em T such that t satisfaz P(T) do i := h(t[x]) acrescente t a HT(i) for each u em U such that u satisfaz P(U) do i := h(u[y]) acrescente u a HU(i) for each i = 0 to max do for each t em HT(i) do for each u in HU(i) do acrescente um registro v a V criado a partir de t e u 43
Execução Execução de Programas: um programa na linguagem interna pode ter vários threads, cada um correspondo a uma subexpressão indepente dentro da expressão relacional inicial proj[codigo.produto] (join[codigo.fornecimento = CODIGO.PRODUTO] (sel(numero='41.738')(fornecimento), sel[melhor_forn = '41.738'](MELHOR_FORN))) proj[codigo.produto] join[codigo.fornecimento = CODIGO.PRODUTO] sel(numero='41.738') sel[melhor_forn = '41.738'] FORNECIMENTO MELHOR_FORN 44
Execução de Programas: Execução a passagem de resultados intermediários de uma operação a outra pode ser feita através de: tabelas externas materializando os resultados tabelas internas manto os resultados no buffer pool tabelas transientes usando uma técnica de pipelining 45
Execução Pipelining: dirigido por demanda: o sistema repetidamente solicita registros à operação no topo do pipeline cada operação por sua vez solicita registros à operação imediatamente em seguida no pipeline dirigido pelo produtor: as operações não esperam por solicitações, mas acresentam registros até a área de trabalho designada esteje cheia 46